Preprocessing Overview

In this section we will take raw microbiome count data and turn it into a clean, analysis-ready phyloseq object. You will:

  1. Load your core inputs
  1. Merge replicate samples
  • Pool all reads for the same subject on the same day into a single sample. OTU counts are summed, and numeric metadata are averaged.
  1. Clean up taxonomy & prune
  • Rename each tip to a simple “OTU1…OTUn” label
  • Remove very low-abundance OTUs (e.g. total count ≤ 1)
  • Collapse your count table and tree to the Genus rank
  • Perform a second pruning step so that only genera with meaningful counts remain
  1. Save analysis-ready objects
  • A cleaned, genus-level phyloseq object (phyloseq_genus.RData)
  • Its melted version (phyloseq_melt_genus.RData) for ggplot workflows
  • The pruned, genus-level tree (tree_genus.RData)
  • Analogous objects for Family, Order, Class, and Phylum

By the end of this stage, you will have one phyloseq object per taxonomic level, each containing:

  • A consistent OTU (or Genus/Family…) count table
  • Matched sample metadata and taxonomic table
  • A pruned phylogenetic tree

Packages Used

In this script we mostly use the phyloseq package, designed for microbiome analysis.

phyloseq Utility

  • Integrates OTU/ASV tables, sample metadata, taxonomy, phylogenetic trees, and (optionally) reference sequences in one S4 object.
  • Provides convenient methods for merging, pruning, rarefaction, distance calculations, and plotting.
  • Under the hood, relies on Bioconductor classes (DataFrames, XStringSets, phylo).

Note: there is much overlap between phyloseq, microeco, and microbiome, but each makes some steps more streamlined than others, so I prefer to switch between them for different stages of analysis.

We will also use the treedataverse package suite for some visualization to check in on our data quality.

treedataverse Utility

The treedataverse suite provides tools for managing, sharing, and visualizing phylogenetic trees in R. It builds on the Dataverse platform to store trees (and associated data) in versioned, citable repositories. With treedataverse, you can:

  • Upload or download phylo objects directly from a Dataverse collection
  • Attach rich metadata (e.g. study details, taxon provenance) to each tree
  • Track updates and collaborate on tree data with full provenance
  • Integrate seamlessly with ggtree and ape for downstream plotting and analysis

ggtree Package within the treedataverse

ggtree is an extension of ggplot2 tailored for phylogenetic trees. It lets you:

  • Map tree data (branches, node labels, support values) to aesthetic scales
  • Annotate clades with heatmaps, bar charts, or tip points (e.g. taxon abundances)
  • Collapse or expand subtrees interactively
  • Align associated data (e.g. trait matrices) alongside your tree in multi-panel layouts
  • Leverage the full grammar of graphics for publication-quality figures

Helper Functions

I created the functions below because I repeatedly use these code chunks to view summaries of my data after each step of processing.

my_skim <- skim_with(numeric  = sfl(p25 = NULL, p50 = NULL, p75 = NULL))

skim_phyloseq <- function(phyloseq) {
options(
  digits            = 2,
  pillar.sigfig     = 2,
  pillar.subtle_num = TRUE
  )
 skim <- psmelt(phyloseq) %>% 
    select(-c(
      subject_certainty, 
      subject_studbook_id, 
      subject_dam_id, 
      subject_sire_id, 
      subject_birth_location, 
      subject_age)) %>%
    group_by(subject) %>% 
    my_skim() %>%
    select(-complete_rate)
 
 return(skim)
}

view_tree <- function(phyloseq, level = NULL, palette = "rcartocolor::Prism") {
  phylum.cols <-  sample(paletteer::paletteer_d(paste0(palette)), size = length(get_taxa_unique(phyloseq, "Phylum")), replace = TRUE) %>%
    set_names(., get_taxa_unique(phyloseq, "Phylum"))
  
  tree1 <- ggtree(phyloseq, branch.length = "none", aes(color = Phylum))
  
  if (is.null(level)) {
    tree2 <- tree1
  } else if (level == "Class") {
    tree2 <- tree1 +
      geom_label(aes(label = Class, fill = Phylum), hjust = -0.05, size = 2, colour = "#000000FF")
  } else if (level == "Phylum") {
    tree2 <- tree1 +
      geom_label(aes(label = Phylum, fill = Phylum), hjust = -0.05, size = 3, colour = "#000000FF")
  }
  
  tree.out <- tree2 +
    scale_color_manual(values = phylum.cols, na.value = "#00000080") +
    scale_fill_manual( values = alpha(c(phylum.cols), 0.3)) +
    theme_tree(legend.position = "none")
  
  return(tree.out)
}

Load Data

Note that I use .RData files to load some of the data below. You could load these same objects in the form of more widely applicable files, if you wish (see below for explaination).

What is an .RData file?

An .RData (or sometimes .rda) file is R’s native, binary workspace format. When you call save() on one or more R objects—data frames, matrices, lists, S4/S3 objects, etc.—R serializes them into a compact, platform-independent file. You can later restore those exact objects (with their names and attributes intact) by calling load(“your_file.RData”). Using .RData is an efficient way to cache intermediate steps, share processed datasets with collaborators, or speed up analyses by skipping time-consuming recomputation.

tree <- read.tree("microeco/loris/refs_tree.treefile")
seqs <- readDNAStringSet("microeco/loris/refs_aligned_mafft.fasta")
load("microeco/loris/tax_table.RData")
load("microeco/loris/sample_table.RData")
load("microeco/loris/otu_table.RData")

Sample Metadata as Factors

Phyloseq will only capture numeric/factor values (not strings) for the metadata, so we need to reformat our character columns.

sample_data <- sample.table %>%
  arrange(subject, collection_day) %>%
  mutate(subject_certainty       = fct_recode(subject_certainty  , "0" = "no" , "1" = "yes"),
         environment_holding     = fct_recode(environment_holding, "0" = "old", "1" = "new"),
         environment_pair_access = fct_recode(environment_pair_access, "0" = "n", "1" = "y"),
         repro_warb_status       = fct_recode(repro_warb_status, "0" = "anestrus", "1" = "estrus")) %>%
  mutate(across(where(is.character), ~factor(.))) %>%
  mutate(diet_name = fct_inorder(diet_name))

Phyloseq Object

phylo <- phyloseq(
  tax_table(as.matrix(tax.table)),
  otu_table(as.matrix(otu.table), taxa_are_rows = TRUE),
  sample_data(sample_data),
  phy_tree(tree),
  refseq(seqs)
)

Preview Starting Data

skim_phyloseq(phylo)
Data summary
Name Piped data
Number of rows 906576
Number of columns 87
_______________________
Column type frequency:
character 9
Date 1
factor 6
numeric 70
________________________
Group variables subject

Variable type: character

skim_variable subject n_missing min max empty n_unique whitespace
OTU culi 0 6 11 0 2244 0
OTU warble 0 6 11 0 2244 0
Sample culi 0 10 15 0 175 0
Sample warble 0 10 15 0 229 0
Kingdom culi 0 11 11 0 1 0
Kingdom warble 0 11 11 0 1 0
Phylum culi 0 13 29 0 26 0
Phylum warble 0 13 29 0 26 0
Class culi 0 3 26 0 56 0
Class warble 0 3 26 0 56 0
Order culi 0 3 26 0 128 0
Order warble 0 3 26 0 128 0
Family culi 0 3 32 0 273 0
Family warble 0 3 32 0 273 0
Genus culi 0 3 26 0 925 0
Genus warble 0 3 26 0 925 0
Species culi 0 15 46 0 2244 0
Species warble 0 15 46 0 2244 0

Variable type: Date

skim_variable subject n_missing min max median n_unique
collection_date culi 0 2023-10-26 2024-12-14 2024-02-04 166
collection_date warble 0 2023-10-26 2024-09-15 2024-03-26 219

Variable type: factor

skim_variable subject n_missing ordered n_unique top_counts
subject_sex culi 0 FALSE 1 m: 392700, f: 0
subject_sex warble 0 FALSE 1 f: 513876, m: 0
subject_day culi 0 FALSE 166 cul: 4488, cul: 4488, cul: 4488, cul: 4488
subject_day warble 0 FALSE 219 war: 4488, war: 4488, war: 4488, war: 4488
environment_holding culi 0 FALSE 2 0: 246840, 1: 145860
environment_holding warble 0 FALSE 2 1: 302940, 0: 210936
environment_pair_access culi 0 FALSE 2 0: 359040, 1: 33660
environment_pair_access warble 0 FALSE 2 0: 489192, 1: 24684
repro_warb_status culi 0 FALSE 3 0: 296208, pre: 53856, 1: 42636
repro_warb_status warble 0 FALSE 3 0: 235620, pre: 235620, 1: 42636
diet_name culi 0 FALSE 3 oat: 249084, bas: 141372, bis: 2244
diet_name warble 0 FALSE 1 bas: 513876, oat: 0, bis: 0

Variable type: numeric

skim_variable subject n_missing mean sd p0 p100 hist
Abundance culi 0 3.21 62.37 0.00 7168.00 ▇▁▁▁▁
Abundance warble 0 2.72 56.75 0.00 8486.00 ▇▁▁▁▁
collection_day culi 0 100.13 62.10 1.00 416.00 ▇▇▂▁▁
collection_day warble 0 161.90 96.25 1.00 326.00 ▇▇▇▆▇
bristol_min culi 8976 3.11 1.03 0.00 6.00 ▁▂▇▁▂
bristol_min warble 0 1.00 0.00 1.00 1.00 ▁▁▇▁▁
bristol_mean culi 0 3.49 1.18 0.00 6.00 ▁▃▇▅▂
bristol_mean warble 0 1.00 0.00 1.00 1.00 ▁▁▇▁▁
bristol_max culi 8976 3.85 1.56 0.00 6.00 ▁▃▇▁▇
bristol_max warble 0 1.00 0.00 1.00 1.00 ▁▁▇▁▁
supplement_probiotic culi 0 0.71 0.44 0.00 1.00 ▃▁▁▁▇
supplement_probiotic warble 0 0.00 0.00 0.00 0.00 ▁▁▇▁▁
supplement_steroid culi 0 0.69 0.43 0.00 1.00 ▃▁▂▁▇
supplement_steroid warble 0 0.00 0.00 0.00 0.00 ▁▁▇▁▁
supplement_fiber culi 0 0.00 0.00 0.00 0.00 ▁▁▇▁▁
supplement_fiber warble 0 0.00 0.00 0.00 0.00 ▁▁▇▁▁
supplement_antibiotic culi 0 0.02 0.13 0.00 1.00 ▇▁▁▁▁
supplement_antibiotic warble 0 0.00 0.00 0.00 0.00 ▁▁▇▁▁
supplement_antidiarrheal culi 0 0.00 0.00 0.00 0.00 ▁▁▇▁▁
supplement_antidiarrheal warble 0 0.00 0.00 0.00 0.00 ▁▁▇▁▁
diet_Total_total culi 0 0.60 0.04 0.54 0.73 ▅▁▇▁▁
diet_Total_total warble 0 0.54 0.00 0.54 0.54 ▁▁▇▁▁
diet_Protein_total culi 0 0.67 0.02 0.60 0.69 ▁▁▁▇▅
diet_Protein_total warble 0 0.69 0.00 0.69 0.69 ▁▁▇▁▁
diet_Fat_total culi 0 0.62 0.01 0.61 0.70 ▇▅▁▁▁
diet_Fat_total warble 0 0.63 0.00 0.63 0.63 ▁▁▇▁▁
diet_CHO_by_diff_total culi 0 0.34 0.04 0.29 0.60 ▅▇▁▁▁
diet_CHO_by_diff_total warble 0 0.29 0.00 0.29 0.29 ▁▁▇▁▁
diet_Ash_total culi 0 1.00 0.02 0.79 1.00 ▁▁▁▁▇
diet_Ash_total warble 0 1.00 0.00 1.00 1.00 ▁▁▇▁▁
diet_Total_dry_matter culi 0 0.56 0.01 0.53 0.56 ▁▁▁▅▇
diet_Total_dry_matter warble 0 0.55 0.00 0.55 0.55 ▁▁▇▁▁
diet_Total_kcal culi 0 0.97 0.00 0.97 0.97 ▁▁▇▁▁
diet_Total_kcal warble 0 0.97 0.00 0.97 0.97 ▁▁▇▁▁
diet_Foods_biscuit_rotation culi 0 0.23 0.02 0.00 0.25 ▁▁▁▁▇
diet_Foods_biscuit_rotation warble 0 0.25 0.00 0.25 0.25 ▁▁▇▁▁
diet_Foods_invertebrate_misc culi 0 0.15 0.03 0.13 0.26 ▇▁▅▁▁
diet_Foods_invertebrate_misc warble 0 0.19 0.00 0.19 0.19 ▁▁▇▁▁
diet_Foods_mazuri_enrich_gum_arabic_5b35 culi 0 0.21 0.01 0.20 0.24 ▇▁▁▅▁
diet_Foods_mazuri_enrich_gum_arabic_5b35 warble 0 0.23 0.00 0.23 0.23 ▁▁▇▁▁
diet_Foods_protein_rotation culi 0 0.04 0.00 0.04 0.07 ▇▁▁▁▁
diet_Foods_protein_rotation warble 0 0.04 0.00 0.04 0.04 ▁▁▇▁▁
diet_Foods_seasonal_vegetables culi 0 0.32 0.02 0.29 0.43 ▅▇▁▁▁
diet_Foods_seasonal_vegetables warble 0 0.29 0.00 0.29 0.29 ▁▁▇▁▁
diet_Foods_egg_whole_cooked_meat_prep culi 0 0.00 0.00 0.00 0.00 ▁▁▇▁▁
diet_Foods_egg_whole_cooked_meat_prep warble 0 0.00 0.00 0.00 0.00 ▁▁▇▁▁
diet_Foods_potato_sweet culi 0 0.00 0.00 0.00 0.00 ▁▁▇▁▁
diet_Foods_potato_sweet warble 0 0.00 0.00 0.00 0.00 ▁▁▇▁▁
diet_Foods_bean_green_fresh culi 0 0.00 0.00 0.00 0.00 ▁▁▇▁▁
diet_Foods_bean_green_fresh warble 0 0.00 0.00 0.00 0.00 ▁▁▇▁▁
diet_Foods_carrot culi 0 0.00 0.00 0.00 0.00 ▁▁▇▁▁
diet_Foods_carrot warble 0 0.00 0.00 0.00 0.00 ▁▁▇▁▁
diet_Foods_pumpkin_canned culi 0 0.00 0.00 0.00 0.00 ▁▁▇▁▁
diet_Foods_pumpkin_canned warble 0 0.00 0.00 0.00 0.00 ▁▁▇▁▁
diet_Foods_egg_whole_raw_meat_prep culi 0 0.00 0.00 0.00 0.00 ▁▁▇▁▁
diet_Foods_egg_whole_raw_meat_prep warble 0 0.00 0.00 0.00 0.00 ▁▁▇▁▁
diet_Foods_seasonal_vegetables_root culi 0 0.00 0.00 0.00 0.00 ▁▁▇▁▁
diet_Foods_seasonal_vegetables_root warble 0 0.00 0.00 0.00 0.00 ▁▁▇▁▁
diet_Foods_seasonal_vegetables_non_root culi 0 0.00 0.00 0.00 0.00 ▁▁▇▁▁
diet_Foods_seasonal_vegetables_non_root warble 0 0.00 0.00 0.00 0.00 ▁▁▇▁▁
diet_Foods_egg_white_only_cooked culi 0 0.00 0.00 0.00 0.00 ▁▁▇▁▁
diet_Foods_egg_white_only_cooked warble 0 0.00 0.00 0.00 0.00 ▁▁▇▁▁
diet_Foods_potato_sweet_cooked culi 0 0.00 0.00 0.00 0.00 ▁▁▇▁▁
diet_Foods_potato_sweet_cooked warble 0 0.00 0.00 0.00 0.00 ▁▁▇▁▁
diet_Foods_celery culi 0 0.00 0.00 0.00 0.00 ▁▁▇▁▁
diet_Foods_celery warble 0 0.00 0.00 0.00 0.00 ▁▁▇▁▁
diet_Foods_lettuce_romaine culi 0 0.00 0.00 0.00 0.00 ▁▁▇▁▁
diet_Foods_lettuce_romaine warble 0 0.00 0.00 0.00 0.00 ▁▁▇▁▁
diet_Foods_ohdz_oatmeal_gel culi 0 0.05 0.04 0.00 0.08 ▅▁▁▁▇
diet_Foods_ohdz_oatmeal_gel warble 0 0.00 0.00 0.00 0.00 ▁▁▇▁▁
diet_Protein_taurine culi 0 0.99 0.08 0.00 1.00 ▁▁▁▁▇
diet_Protein_taurine warble 0 1.00 0.00 1.00 1.00 ▁▁▇▁▁
diet_Protein_methionine culi 0 0.44 0.01 0.32 0.45 ▁▁▁▁▇
diet_Protein_methionine warble 0 0.45 0.00 0.45 0.45 ▁▁▇▁▁
diet_Fat_omega_3_ala__epa__dha culi 0 0.99 0.08 0.00 1.00 ▁▁▁▁▇
diet_Fat_omega_3_ala__epa__dha warble 0 1.00 0.00 1.00 1.00 ▁▁▇▁▁
diet_Fat_omega_6_la__gla__aa culi 0 0.99 0.08 0.00 1.00 ▁▁▁▁▇
diet_Fat_omega_6_la__gla__aa warble 0 1.00 0.00 1.00 1.00 ▁▁▇▁▁
diet_CHO_by_diff_starch culi 0 0.95 0.07 0.38 1.00 ▁▁▁▁▇
diet_CHO_by_diff_starch warble 0 0.88 0.00 0.88 0.88 ▁▁▇▁▁
diet_CHO_by_diff_ndf culi 0 0.78 0.01 0.75 0.78 ▁▁▅▁▇
diet_CHO_by_diff_ndf warble 0 0.77 0.00 0.77 0.77 ▁▁▇▁▁
diet_CHO_by_diff_adf culi 0 0.99 0.05 0.31 1.00 ▁▁▁▁▇
diet_CHO_by_diff_adf warble 0 0.97 0.00 0.97 0.97 ▁▁▇▁▁
diet_CHO_by_diff_crude_fiber culi 0 0.57 0.01 0.57 0.71 ▇▁▁▁▁
diet_CHO_by_diff_crude_fiber warble 0 0.57 0.00 0.57 0.57 ▁▁▇▁▁
diet_CHO_by_diff_tdf culi 0 0.41 0.04 0.38 0.76 ▇▁▁▁▁
diet_CHO_by_diff_tdf warble 0 0.38 0.00 0.38 0.38 ▁▁▇▁▁
diet_Ash_calcium culi 0 0.96 0.01 0.77 0.97 ▁▁▁▁▇
diet_Ash_calcium warble 0 0.97 0.00 0.97 0.97 ▁▁▇▁▁
diet_Ash_phosphorus culi 0 0.96 0.03 0.94 1.00 ▇▁▁▁▅
diet_Ash_phosphorus warble 0 1.00 0.00 1.00 1.00 ▁▁▇▁▁
diet_Ash_potassium culi 0 0.88 0.00 0.88 0.91 ▇▁▁▁▁
diet_Ash_potassium warble 0 0.88 0.00 0.88 0.88 ▁▁▇▁▁
diet_Ash_magnesium culi 0 0.50 0.05 0.44 0.72 ▅▇▁▁▁
diet_Ash_magnesium warble 0 0.44 0.00 0.44 0.44 ▁▁▇▁▁
diet_Ash_copper culi 0 0.99 0.05 0.31 1.00 ▁▁▁▁▇
diet_Ash_copper warble 0 1.00 0.00 1.00 1.00 ▁▁▇▁▁
diet_Ash_iron culi 0 0.98 0.02 0.79 1.00 ▁▁▁▁▇
diet_Ash_iron warble 0 1.00 0.00 1.00 1.00 ▁▁▇▁▁
diet_Ash_zinc culi 0 0.98 0.04 0.47 1.00 ▁▁▁▁▇
diet_Ash_zinc warble 0 1.00 0.00 1.00 1.00 ▁▁▇▁▁
diet_Ash_manganese culi 0 0.99 0.06 0.24 1.00 ▁▁▁▁▇
diet_Ash_manganese warble 0 1.00 0.00 1.00 1.00 ▁▁▇▁▁
diet_Ash_iodine culi 0 0.99 0.08 0.00 1.00 ▁▁▁▁▇
diet_Ash_iodine warble 0 1.00 0.00 1.00 1.00 ▁▁▇▁▁
diet_Ash_ca_p culi 0 0.84 0.02 0.69 0.86 ▁▁▁▅▇
diet_Ash_ca_p warble 0 0.81 0.00 0.81 0.81 ▁▁▇▁▁
diet_Vitamins_vit_a_iu culi 0 0.25 0.02 0.23 0.27 ▅▁▁▁▇
diet_Vitamins_vit_a_iu warble 0 0.23 0.00 0.23 0.23 ▁▁▇▁▁
diet_Vitamins_vit_d3 culi 0 0.98 0.02 0.73 0.98 ▁▁▁▁▇
diet_Vitamins_vit_d3 warble 0 0.98 0.00 0.98 0.98 ▁▁▇▁▁
diet_Vitamins_vit_e culi 0 0.93 0.10 0.64 1.00 ▁▁▅▁▇
diet_Vitamins_vit_e warble 0 0.80 0.00 0.80 0.80 ▁▁▇▁▁
diet_Vitamins_vit_k culi 0 0.97 0.04 0.40 0.98 ▁▁▁▁▇
diet_Vitamins_vit_k warble 0 0.96 0.00 0.96 0.96 ▁▁▇▁▁
diet_Vitamins_vit_b1_thiamin culi 0 0.98 0.05 0.28 0.99 ▁▁▁▁▇
diet_Vitamins_vit_b1_thiamin warble 0 0.98 0.00 0.98 0.98 ▁▁▇▁▁
diet_Vitamins_vit_b2_riboflavin culi 0 0.91 0.03 0.68 0.94 ▁▁▁▇▅
diet_Vitamins_vit_b2_riboflavin warble 0 0.94 0.00 0.94 0.94 ▁▁▇▁▁
diet_Vitamins_vit_b3_niacin culi 0 0.99 0.04 0.49 1.00 ▁▁▁▁▇
diet_Vitamins_vit_b3_niacin warble 0 1.00 0.00 1.00 1.00 ▁▁▇▁▁
diet_Vitamins_choline culi 0 0.50 0.01 0.46 0.52 ▁▁▇▁▅
diet_Vitamins_choline warble 0 0.52 0.00 0.52 0.52 ▁▁▇▁▁
diet_Vitamins_vit_b5_pantothenic_acid culi 0 0.92 0.04 0.39 0.94 ▁▁▁▁▇
diet_Vitamins_vit_b5_pantothenic_acid warble 0 0.94 0.00 0.94 0.94 ▁▁▇▁▁
diet_Vitamins_vit_b6_pyridoxine culi 0 0.96 0.05 0.35 0.96 ▁▁▁▁▇
diet_Vitamins_vit_b6_pyridoxine warble 0 0.96 0.00 0.96 0.96 ▁▁▇▁▁
diet_Vitamins_vit_b7_biotin culi 0 0.99 0.02 0.72 1.00 ▁▁▁▁▇
diet_Vitamins_vit_b7_biotin warble 0 1.00 0.00 1.00 1.00 ▁▁▇▁▁
diet_Vitamins_folic_acid culi 0 0.99 0.07 0.05 1.00 ▁▁▁▁▇
diet_Vitamins_folic_acid warble 0 1.00 0.00 1.00 1.00 ▁▁▇▁▁
diet_Vitamins_vit_b12 culi 0 0.50 0.07 0.45 1.00 ▇▅▁▁▁
diet_Vitamins_vit_b12 warble 0 0.56 0.00 0.56 0.56 ▁▁▇▁▁
diet_Vitamins_vit_c culi 0 0.97 0.04 0.65 1.00 ▁▁▁▁▇
diet_Vitamins_vit_c warble 0 0.93 0.00 0.93 0.93 ▁▁▇▁▁
diet_Vitamins_beta_carotene culi 0 0.21 0.02 0.18 0.24 ▅▁▁▇▁
diet_Vitamins_beta_carotene warble 0 0.18 0.00 0.18 0.18 ▁▁▇▁▁
diet_Vitamins_lycopene culi 0 0.40 0.06 0.32 0.65 ▅▇▁▁▁
diet_Vitamins_lycopene warble 0 0.32 0.00 0.32 0.32 ▁▁▇▁▁
view_tree(phylo) + ggtitle("Species-Level OTUs before Filtering")

That looks like some very dense, messy taxonomic data!


Dereplicate Samples

First we will create a version that merges the replicated samples so that we have one observation per subject per day. This function’s default in phyloseq will aggregate the OTU counts across multiple samples as a sum of reads while taking mean values for everything in the metadata.

This pooling step creates one composite sample per subject per day, avoiding pseudo‐replication in downstream diversity metrics.

phylo_merged <- phylo %>% merge_samples("subject_day")

skim_phyloseq(phylo_merged)
Data summary
Name Piped data
Number of rows 863940
Number of columns 87
_______________________
Column type frequency:
character 9
numeric 77
________________________
Group variables subject

Variable type: character

skim_variable subject n_missing min max empty n_unique whitespace
OTU 1 0 6 11 0 2244 0
OTU 2 0 6 11 0 2244 0
Sample 1 0 6 8 0 166 0
Sample 2 0 8 10 0 219 0
Kingdom 1 0 11 11 0 1 0
Kingdom 2 0 11 11 0 1 0
Phylum 1 0 13 29 0 26 0
Phylum 2 0 13 29 0 26 0
Class 1 0 3 26 0 56 0
Class 2 0 3 26 0 56 0
Order 1 0 3 26 0 128 0
Order 2 0 3 26 0 128 0
Family 1 0 3 32 0 273 0
Family 2 0 3 32 0 273 0
Genus 1 0 3 26 0 925 0
Genus 2 0 3 26 0 925 0
Species 1 0 15 46 0 2244 0
Species 2 0 15 46 0 2244 0

Variable type: numeric

skim_variable subject n_missing mean sd p0 p100 hist
Abundance 1 0 3.4e+00 65.57 0.0e+00 7.2e+03 ▇▁▁▁▁
Abundance 2 0 2.9e+00 58.71 0.0e+00 8.5e+03 ▇▁▁▁▁
subject_sex 1 0 2.0e+00 0.00 2.0e+00 2.0e+00 ▁▁▇▁▁
subject_sex 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
subject_day 1 0 8.4e+01 47.92 1.0e+00 1.7e+02 ▇▇▇▇▇
subject_day 2 0 2.8e+02 63.22 1.7e+02 3.8e+02 ▇▇▇▇▇
collection_day 1 0 1.0e+02 62.09 1.0e+00 4.2e+02 ▇▇▂▁▁
collection_day 2 0 1.6e+02 95.94 1.0e+00 3.3e+02 ▇▇▇▆▇
collection_date 1 0 2.0e+04 62.09 2.0e+04 2.0e+04 ▇▇▂▁▁
collection_date 2 0 2.0e+04 95.94 2.0e+04 2.0e+04 ▇▇▇▆▇
environment_holding 1 0 1.6e+00 0.48 1.0e+00 2.0e+00 ▅▁▁▁▇
environment_holding 2 0 1.4e+00 0.49 1.0e+00 2.0e+00 ▇▁▁▁▆
environment_pair_access 1 0 1.1e+00 0.29 1.0e+00 2.0e+00 ▇▁▁▁▁
environment_pair_access 2 0 1.1e+00 0.22 1.0e+00 2.0e+00 ▇▁▁▁▁
repro_warb_status 1 0 1.4e+00 0.73 1.0e+00 3.0e+00 ▇▁▁▁▂
repro_warb_status 2 0 2.0e+00 0.96 1.0e+00 3.0e+00 ▇▁▂▁▇
bristol_min 1 8976 3.1e+00 1.02 0.0e+00 6.0e+00 ▁▂▇▁▂
bristol_min 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
bristol_mean 1 0 3.5e+00 1.17 0.0e+00 6.0e+00 ▁▃▇▃▂
bristol_mean 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
bristol_max 1 8976 3.8e+00 1.55 0.0e+00 6.0e+00 ▁▃▇▁▆
bristol_max 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
supplement_probiotic 1 0 7.1e-01 0.44 0.0e+00 1.0e+00 ▃▁▁▁▇
supplement_probiotic 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
supplement_steroid 1 0 7.0e-01 0.43 0.0e+00 1.0e+00 ▃▁▂▁▇
supplement_steroid 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
supplement_fiber 1 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
supplement_fiber 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
supplement_antibiotic 1 0 2.0e-02 0.13 0.0e+00 1.0e+00 ▇▁▁▁▁
supplement_antibiotic 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
supplement_antidiarrheal 1 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
supplement_antidiarrheal 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_name 1 0 1.7e+00 0.49 1.0e+00 3.0e+00 ▅▁▇▁▁
diet_name 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
diet_Total_total 1 0 6.0e-01 0.04 5.4e-01 7.3e-01 ▅▁▇▁▁
diet_Total_total 2 0 5.4e-01 0.00 5.4e-01 5.4e-01 ▁▁▇▁▁
diet_Protein_total 1 0 6.7e-01 0.02 6.0e-01 6.9e-01 ▁▁▁▇▅
diet_Protein_total 2 0 6.9e-01 0.00 6.9e-01 6.9e-01 ▁▁▇▁▁
diet_Fat_total 1 0 6.2e-01 0.01 6.1e-01 7.0e-01 ▇▅▁▁▁
diet_Fat_total 2 0 6.3e-01 0.00 6.3e-01 6.3e-01 ▁▁▇▁▁
diet_CHO_by_diff_total 1 0 3.4e-01 0.04 2.9e-01 6.0e-01 ▅▇▁▁▁
diet_CHO_by_diff_total 2 0 2.9e-01 0.00 2.9e-01 2.9e-01 ▁▁▇▁▁
diet_Ash_total 1 0 1.0e+00 0.02 7.9e-01 1.0e+00 ▁▁▁▁▇
diet_Ash_total 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
diet_Total_dry_matter 1 0 5.6e-01 0.01 5.3e-01 5.6e-01 ▁▁▁▅▇
diet_Total_dry_matter 2 0 5.5e-01 0.00 5.5e-01 5.5e-01 ▁▁▇▁▁
diet_Total_kcal 1 0 9.7e-01 0.00 9.7e-01 9.7e-01 ▁▁▇▁▁
diet_Total_kcal 2 0 9.7e-01 0.00 9.7e-01 9.7e-01 ▁▁▇▁▁
diet_Foods_biscuit_rotation 1 0 2.3e-01 0.02 0.0e+00 2.5e-01 ▁▁▁▁▇
diet_Foods_biscuit_rotation 2 0 2.5e-01 0.00 2.5e-01 2.5e-01 ▁▁▇▁▁
diet_Foods_invertebrate_misc 1 0 1.5e-01 0.03 1.3e-01 2.6e-01 ▇▁▅▁▁
diet_Foods_invertebrate_misc 2 0 1.9e-01 0.00 1.9e-01 1.9e-01 ▁▁▇▁▁
diet_Foods_mazuri_enrich_gum_arabic_5b35 1 0 2.1e-01 0.01 2.0e-01 2.4e-01 ▇▁▁▅▁
diet_Foods_mazuri_enrich_gum_arabic_5b35 2 0 2.3e-01 0.00 2.3e-01 2.3e-01 ▁▁▇▁▁
diet_Foods_protein_rotation 1 0 4.0e-02 0.00 4.0e-02 7.0e-02 ▇▁▁▁▁
diet_Foods_protein_rotation 2 0 4.0e-02 0.00 4.0e-02 4.0e-02 ▁▁▇▁▁
diet_Foods_seasonal_vegetables 1 0 3.2e-01 0.02 2.9e-01 4.3e-01 ▅▇▁▁▁
diet_Foods_seasonal_vegetables 2 0 2.9e-01 0.00 2.9e-01 2.9e-01 ▁▁▇▁▁
diet_Foods_egg_whole_cooked_meat_prep 1 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_egg_whole_cooked_meat_prep 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_potato_sweet 1 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_potato_sweet 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_bean_green_fresh 1 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_bean_green_fresh 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_carrot 1 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_carrot 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_pumpkin_canned 1 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_pumpkin_canned 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_egg_whole_raw_meat_prep 1 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_egg_whole_raw_meat_prep 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_seasonal_vegetables_root 1 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_seasonal_vegetables_root 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_seasonal_vegetables_non_root 1 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_seasonal_vegetables_non_root 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_egg_white_only_cooked 1 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_egg_white_only_cooked 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_potato_sweet_cooked 1 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_potato_sweet_cooked 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_celery 1 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_celery 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_lettuce_romaine 1 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_lettuce_romaine 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_ohdz_oatmeal_gel 1 0 5.0e-02 0.04 0.0e+00 8.0e-02 ▅▁▁▁▇
diet_Foods_ohdz_oatmeal_gel 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Protein_taurine 1 0 9.9e-01 0.08 0.0e+00 1.0e+00 ▁▁▁▁▇
diet_Protein_taurine 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
diet_Protein_methionine 1 0 4.4e-01 0.01 3.2e-01 4.5e-01 ▁▁▁▁▇
diet_Protein_methionine 2 0 4.5e-01 0.00 4.5e-01 4.5e-01 ▁▁▇▁▁
diet_Fat_omega_3_ala__epa__dha 1 0 9.9e-01 0.08 0.0e+00 1.0e+00 ▁▁▁▁▇
diet_Fat_omega_3_ala__epa__dha 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
diet_Fat_omega_6_la__gla__aa 1 0 9.9e-01 0.08 0.0e+00 1.0e+00 ▁▁▁▁▇
diet_Fat_omega_6_la__gla__aa 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
diet_CHO_by_diff_starch 1 0 9.5e-01 0.07 3.8e-01 1.0e+00 ▁▁▁▁▇
diet_CHO_by_diff_starch 2 0 8.8e-01 0.00 8.8e-01 8.8e-01 ▁▁▇▁▁
diet_CHO_by_diff_ndf 1 0 7.8e-01 0.01 7.5e-01 7.8e-01 ▁▁▅▁▇
diet_CHO_by_diff_ndf 2 0 7.7e-01 0.00 7.7e-01 7.7e-01 ▁▁▇▁▁
diet_CHO_by_diff_adf 1 0 9.9e-01 0.05 3.1e-01 1.0e+00 ▁▁▁▁▇
diet_CHO_by_diff_adf 2 0 9.7e-01 0.00 9.7e-01 9.7e-01 ▁▁▇▁▁
diet_CHO_by_diff_crude_fiber 1 0 5.7e-01 0.01 5.7e-01 7.1e-01 ▇▁▁▁▁
diet_CHO_by_diff_crude_fiber 2 0 5.7e-01 0.00 5.7e-01 5.7e-01 ▁▁▇▁▁
diet_CHO_by_diff_tdf 1 0 4.1e-01 0.04 3.8e-01 7.6e-01 ▇▁▁▁▁
diet_CHO_by_diff_tdf 2 0 3.8e-01 0.00 3.8e-01 3.8e-01 ▁▁▇▁▁
diet_Ash_calcium 1 0 9.6e-01 0.01 7.7e-01 9.7e-01 ▁▁▁▁▇
diet_Ash_calcium 2 0 9.7e-01 0.00 9.7e-01 9.7e-01 ▁▁▇▁▁
diet_Ash_phosphorus 1 0 9.6e-01 0.03 9.4e-01 1.0e+00 ▇▁▁▁▅
diet_Ash_phosphorus 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
diet_Ash_potassium 1 0 8.8e-01 0.00 8.8e-01 9.1e-01 ▇▁▁▁▁
diet_Ash_potassium 2 0 8.8e-01 0.00 8.8e-01 8.8e-01 ▁▁▇▁▁
diet_Ash_magnesium 1 0 5.0e-01 0.05 4.4e-01 7.2e-01 ▅▇▁▁▁
diet_Ash_magnesium 2 0 4.4e-01 0.00 4.4e-01 4.4e-01 ▁▁▇▁▁
diet_Ash_copper 1 0 9.9e-01 0.05 3.1e-01 1.0e+00 ▁▁▁▁▇
diet_Ash_copper 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
diet_Ash_iron 1 0 9.8e-01 0.02 7.9e-01 1.0e+00 ▁▁▁▁▇
diet_Ash_iron 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
diet_Ash_zinc 1 0 9.8e-01 0.04 4.7e-01 1.0e+00 ▁▁▁▁▇
diet_Ash_zinc 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
diet_Ash_manganese 1 0 9.9e-01 0.06 2.4e-01 1.0e+00 ▁▁▁▁▇
diet_Ash_manganese 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
diet_Ash_iodine 1 0 9.9e-01 0.08 0.0e+00 1.0e+00 ▁▁▁▁▇
diet_Ash_iodine 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
diet_Ash_ca_p 1 0 8.4e-01 0.02 6.9e-01 8.6e-01 ▁▁▁▅▇
diet_Ash_ca_p 2 0 8.1e-01 0.00 8.1e-01 8.1e-01 ▁▁▇▁▁
diet_Vitamins_vit_a_iu 1 0 2.5e-01 0.02 2.3e-01 2.7e-01 ▅▁▁▁▇
diet_Vitamins_vit_a_iu 2 0 2.3e-01 0.00 2.3e-01 2.3e-01 ▁▁▇▁▁
diet_Vitamins_vit_d3 1 0 9.8e-01 0.02 7.3e-01 9.8e-01 ▁▁▁▁▇
diet_Vitamins_vit_d3 2 0 9.8e-01 0.00 9.8e-01 9.8e-01 ▁▁▇▁▁
diet_Vitamins_vit_e 1 0 9.3e-01 0.10 6.4e-01 1.0e+00 ▁▁▅▁▇
diet_Vitamins_vit_e 2 0 8.0e-01 0.00 8.0e-01 8.0e-01 ▁▁▇▁▁
diet_Vitamins_vit_k 1 0 9.7e-01 0.04 4.0e-01 9.8e-01 ▁▁▁▁▇
diet_Vitamins_vit_k 2 0 9.6e-01 0.00 9.6e-01 9.6e-01 ▁▁▇▁▁
diet_Vitamins_vit_b1_thiamin 1 0 9.8e-01 0.06 2.8e-01 9.9e-01 ▁▁▁▁▇
diet_Vitamins_vit_b1_thiamin 2 0 9.8e-01 0.00 9.8e-01 9.8e-01 ▁▁▇▁▁
diet_Vitamins_vit_b2_riboflavin 1 0 9.0e-01 0.03 6.8e-01 9.4e-01 ▁▁▁▇▅
diet_Vitamins_vit_b2_riboflavin 2 0 9.4e-01 0.00 9.4e-01 9.4e-01 ▁▁▇▁▁
diet_Vitamins_vit_b3_niacin 1 0 9.9e-01 0.04 4.9e-01 1.0e+00 ▁▁▁▁▇
diet_Vitamins_vit_b3_niacin 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
diet_Vitamins_choline 1 0 5.0e-01 0.01 4.6e-01 5.2e-01 ▁▁▇▁▅
diet_Vitamins_choline 2 0 5.2e-01 0.00 5.2e-01 5.2e-01 ▁▁▇▁▁
diet_Vitamins_vit_b5_pantothenic_acid 1 0 9.2e-01 0.04 3.9e-01 9.4e-01 ▁▁▁▁▇
diet_Vitamins_vit_b5_pantothenic_acid 2 0 9.4e-01 0.00 9.4e-01 9.4e-01 ▁▁▇▁▁
diet_Vitamins_vit_b6_pyridoxine 1 0 9.6e-01 0.05 3.5e-01 9.6e-01 ▁▁▁▁▇
diet_Vitamins_vit_b6_pyridoxine 2 0 9.6e-01 0.00 9.6e-01 9.6e-01 ▁▁▇▁▁
diet_Vitamins_vit_b7_biotin 1 0 9.9e-01 0.02 7.2e-01 1.0e+00 ▁▁▁▁▇
diet_Vitamins_vit_b7_biotin 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
diet_Vitamins_folic_acid 1 0 9.9e-01 0.07 5.0e-02 1.0e+00 ▁▁▁▁▇
diet_Vitamins_folic_acid 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
diet_Vitamins_vit_b12 1 0 4.9e-01 0.07 4.5e-01 1.0e+00 ▇▅▁▁▁
diet_Vitamins_vit_b12 2 0 5.6e-01 0.00 5.6e-01 5.6e-01 ▁▁▇▁▁
diet_Vitamins_vit_c 1 0 9.7e-01 0.04 6.5e-01 1.0e+00 ▁▁▁▁▇
diet_Vitamins_vit_c 2 0 9.3e-01 0.00 9.3e-01 9.3e-01 ▁▁▇▁▁
diet_Vitamins_beta_carotene 1 0 2.1e-01 0.02 1.8e-01 2.4e-01 ▅▁▁▇▁
diet_Vitamins_beta_carotene 2 0 1.8e-01 0.00 1.8e-01 1.8e-01 ▁▁▇▁▁
diet_Vitamins_lycopene 1 0 4.0e-01 0.06 3.2e-01 6.5e-01 ▅▇▁▁▁
diet_Vitamins_lycopene 2 0 3.2e-01 0.00 3.2e-01 3.2e-01 ▁▁▇▁▁

Clean up Taxonomy

Prune Taxa

Drop the OTUs with the lowest abundances. Constraining your dataset to taxa with >1 total read helps stabilize diversity estimates and speeds up tree operations.

First let’s see how many OTUs we lose at different thresholds

rare_otus <- names(taxa_sums(phylo_merged)[taxa_sums(phylo_merged) <= 1])
keep_otus <- names(taxa_sums(phylo_merged)[taxa_sums(phylo_merged) > 1])

length(rare_otus)
[1] 599
length(keep_otus)
[1] 1645

We will remove 599 otus where the total abundance is less than or equal to 1 and keep the 1645 otus with a total abundance of at least 2. (You can change the value in the keep_otus function above to use a higher/lower threshold.)

phylo_pruned <- prune_taxa(keep_otus, phylo_merged)
skim_phyloseq(phylo_pruned)
Data summary
Name Piped data
Number of rows 633325
Number of columns 87
_______________________
Column type frequency:
character 9
numeric 77
________________________
Group variables subject

Variable type: character

skim_variable subject n_missing min max empty n_unique whitespace
OTU 1 0 6 11 0 1645 0
OTU 2 0 6 11 0 1645 0
Sample 1 0 6 8 0 166 0
Sample 2 0 8 10 0 219 0
Kingdom 1 0 11 11 0 1 0
Kingdom 2 0 11 11 0 1 0
Phylum 1 0 13 29 0 25 0
Phylum 2 0 13 29 0 25 0
Class 1 0 3 24 0 51 0
Class 2 0 3 24 0 51 0
Order 1 0 3 26 0 105 0
Order 2 0 3 26 0 105 0
Family 1 0 3 32 0 218 0
Family 2 0 3 32 0 218 0
Genus 1 0 3 26 0 699 0
Genus 2 0 3 26 0 699 0
Species 1 0 15 46 0 1645 0
Species 2 0 15 46 0 1645 0

Variable type: numeric

skim_variable subject n_missing mean sd p0 p100 hist
Abundance 1 0 4.6e+00 76.55 0.0e+00 7.2e+03 ▇▁▁▁▁
Abundance 2 0 3.9e+00 68.54 0.0e+00 8.5e+03 ▇▁▁▁▁
subject_sex 1 0 2.0e+00 0.00 2.0e+00 2.0e+00 ▁▁▇▁▁
subject_sex 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
subject_day 1 0 8.4e+01 47.92 1.0e+00 1.7e+02 ▇▇▇▇▇
subject_day 2 0 2.8e+02 63.22 1.7e+02 3.8e+02 ▇▇▇▇▇
collection_day 1 0 1.0e+02 62.09 1.0e+00 4.2e+02 ▇▇▂▁▁
collection_day 2 0 1.6e+02 95.94 1.0e+00 3.3e+02 ▇▇▇▆▇
collection_date 1 0 2.0e+04 62.09 2.0e+04 2.0e+04 ▇▇▂▁▁
collection_date 2 0 2.0e+04 95.94 2.0e+04 2.0e+04 ▇▇▇▆▇
environment_holding 1 0 1.6e+00 0.48 1.0e+00 2.0e+00 ▅▁▁▁▇
environment_holding 2 0 1.4e+00 0.49 1.0e+00 2.0e+00 ▇▁▁▁▆
environment_pair_access 1 0 1.1e+00 0.29 1.0e+00 2.0e+00 ▇▁▁▁▁
environment_pair_access 2 0 1.1e+00 0.22 1.0e+00 2.0e+00 ▇▁▁▁▁
repro_warb_status 1 0 1.4e+00 0.73 1.0e+00 3.0e+00 ▇▁▁▁▂
repro_warb_status 2 0 2.0e+00 0.96 1.0e+00 3.0e+00 ▇▁▂▁▇
bristol_min 1 6580 3.1e+00 1.02 0.0e+00 6.0e+00 ▁▂▇▁▂
bristol_min 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
bristol_mean 1 0 3.5e+00 1.17 0.0e+00 6.0e+00 ▁▃▇▃▂
bristol_mean 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
bristol_max 1 6580 3.8e+00 1.55 0.0e+00 6.0e+00 ▁▃▇▁▆
bristol_max 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
supplement_probiotic 1 0 7.1e-01 0.44 0.0e+00 1.0e+00 ▃▁▁▁▇
supplement_probiotic 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
supplement_steroid 1 0 7.0e-01 0.43 0.0e+00 1.0e+00 ▃▁▂▁▇
supplement_steroid 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
supplement_fiber 1 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
supplement_fiber 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
supplement_antibiotic 1 0 2.0e-02 0.13 0.0e+00 1.0e+00 ▇▁▁▁▁
supplement_antibiotic 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
supplement_antidiarrheal 1 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
supplement_antidiarrheal 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_name 1 0 1.7e+00 0.49 1.0e+00 3.0e+00 ▅▁▇▁▁
diet_name 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
diet_Total_total 1 0 6.0e-01 0.04 5.4e-01 7.3e-01 ▅▁▇▁▁
diet_Total_total 2 0 5.4e-01 0.00 5.4e-01 5.4e-01 ▁▁▇▁▁
diet_Protein_total 1 0 6.7e-01 0.02 6.0e-01 6.9e-01 ▁▁▁▇▅
diet_Protein_total 2 0 6.9e-01 0.00 6.9e-01 6.9e-01 ▁▁▇▁▁
diet_Fat_total 1 0 6.2e-01 0.01 6.1e-01 7.0e-01 ▇▅▁▁▁
diet_Fat_total 2 0 6.3e-01 0.00 6.3e-01 6.3e-01 ▁▁▇▁▁
diet_CHO_by_diff_total 1 0 3.4e-01 0.04 2.9e-01 6.0e-01 ▅▇▁▁▁
diet_CHO_by_diff_total 2 0 2.9e-01 0.00 2.9e-01 2.9e-01 ▁▁▇▁▁
diet_Ash_total 1 0 1.0e+00 0.02 7.9e-01 1.0e+00 ▁▁▁▁▇
diet_Ash_total 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
diet_Total_dry_matter 1 0 5.6e-01 0.01 5.3e-01 5.6e-01 ▁▁▁▅▇
diet_Total_dry_matter 2 0 5.5e-01 0.00 5.5e-01 5.5e-01 ▁▁▇▁▁
diet_Total_kcal 1 0 9.7e-01 0.00 9.7e-01 9.7e-01 ▁▁▇▁▁
diet_Total_kcal 2 0 9.7e-01 0.00 9.7e-01 9.7e-01 ▁▁▇▁▁
diet_Foods_biscuit_rotation 1 0 2.3e-01 0.02 0.0e+00 2.5e-01 ▁▁▁▁▇
diet_Foods_biscuit_rotation 2 0 2.5e-01 0.00 2.5e-01 2.5e-01 ▁▁▇▁▁
diet_Foods_invertebrate_misc 1 0 1.5e-01 0.03 1.3e-01 2.6e-01 ▇▁▅▁▁
diet_Foods_invertebrate_misc 2 0 1.9e-01 0.00 1.9e-01 1.9e-01 ▁▁▇▁▁
diet_Foods_mazuri_enrich_gum_arabic_5b35 1 0 2.1e-01 0.01 2.0e-01 2.4e-01 ▇▁▁▅▁
diet_Foods_mazuri_enrich_gum_arabic_5b35 2 0 2.3e-01 0.00 2.3e-01 2.3e-01 ▁▁▇▁▁
diet_Foods_protein_rotation 1 0 4.0e-02 0.00 4.0e-02 7.0e-02 ▇▁▁▁▁
diet_Foods_protein_rotation 2 0 4.0e-02 0.00 4.0e-02 4.0e-02 ▁▁▇▁▁
diet_Foods_seasonal_vegetables 1 0 3.2e-01 0.02 2.9e-01 4.3e-01 ▅▇▁▁▁
diet_Foods_seasonal_vegetables 2 0 2.9e-01 0.00 2.9e-01 2.9e-01 ▁▁▇▁▁
diet_Foods_egg_whole_cooked_meat_prep 1 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_egg_whole_cooked_meat_prep 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_potato_sweet 1 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_potato_sweet 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_bean_green_fresh 1 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_bean_green_fresh 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_carrot 1 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_carrot 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_pumpkin_canned 1 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_pumpkin_canned 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_egg_whole_raw_meat_prep 1 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_egg_whole_raw_meat_prep 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_seasonal_vegetables_root 1 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_seasonal_vegetables_root 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_seasonal_vegetables_non_root 1 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_seasonal_vegetables_non_root 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_egg_white_only_cooked 1 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_egg_white_only_cooked 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_potato_sweet_cooked 1 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_potato_sweet_cooked 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_celery 1 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_celery 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_lettuce_romaine 1 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_lettuce_romaine 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_ohdz_oatmeal_gel 1 0 5.0e-02 0.04 0.0e+00 8.0e-02 ▅▁▁▁▇
diet_Foods_ohdz_oatmeal_gel 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Protein_taurine 1 0 9.9e-01 0.08 0.0e+00 1.0e+00 ▁▁▁▁▇
diet_Protein_taurine 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
diet_Protein_methionine 1 0 4.4e-01 0.01 3.2e-01 4.5e-01 ▁▁▁▁▇
diet_Protein_methionine 2 0 4.5e-01 0.00 4.5e-01 4.5e-01 ▁▁▇▁▁
diet_Fat_omega_3_ala__epa__dha 1 0 9.9e-01 0.08 0.0e+00 1.0e+00 ▁▁▁▁▇
diet_Fat_omega_3_ala__epa__dha 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
diet_Fat_omega_6_la__gla__aa 1 0 9.9e-01 0.08 0.0e+00 1.0e+00 ▁▁▁▁▇
diet_Fat_omega_6_la__gla__aa 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
diet_CHO_by_diff_starch 1 0 9.5e-01 0.07 3.8e-01 1.0e+00 ▁▁▁▁▇
diet_CHO_by_diff_starch 2 0 8.8e-01 0.00 8.8e-01 8.8e-01 ▁▁▇▁▁
diet_CHO_by_diff_ndf 1 0 7.8e-01 0.01 7.5e-01 7.8e-01 ▁▁▅▁▇
diet_CHO_by_diff_ndf 2 0 7.7e-01 0.00 7.7e-01 7.7e-01 ▁▁▇▁▁
diet_CHO_by_diff_adf 1 0 9.9e-01 0.05 3.1e-01 1.0e+00 ▁▁▁▁▇
diet_CHO_by_diff_adf 2 0 9.7e-01 0.00 9.7e-01 9.7e-01 ▁▁▇▁▁
diet_CHO_by_diff_crude_fiber 1 0 5.7e-01 0.01 5.7e-01 7.1e-01 ▇▁▁▁▁
diet_CHO_by_diff_crude_fiber 2 0 5.7e-01 0.00 5.7e-01 5.7e-01 ▁▁▇▁▁
diet_CHO_by_diff_tdf 1 0 4.1e-01 0.04 3.8e-01 7.6e-01 ▇▁▁▁▁
diet_CHO_by_diff_tdf 2 0 3.8e-01 0.00 3.8e-01 3.8e-01 ▁▁▇▁▁
diet_Ash_calcium 1 0 9.6e-01 0.01 7.7e-01 9.7e-01 ▁▁▁▁▇
diet_Ash_calcium 2 0 9.7e-01 0.00 9.7e-01 9.7e-01 ▁▁▇▁▁
diet_Ash_phosphorus 1 0 9.6e-01 0.03 9.4e-01 1.0e+00 ▇▁▁▁▅
diet_Ash_phosphorus 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
diet_Ash_potassium 1 0 8.8e-01 0.00 8.8e-01 9.1e-01 ▇▁▁▁▁
diet_Ash_potassium 2 0 8.8e-01 0.00 8.8e-01 8.8e-01 ▁▁▇▁▁
diet_Ash_magnesium 1 0 5.0e-01 0.05 4.4e-01 7.2e-01 ▅▇▁▁▁
diet_Ash_magnesium 2 0 4.4e-01 0.00 4.4e-01 4.4e-01 ▁▁▇▁▁
diet_Ash_copper 1 0 9.9e-01 0.05 3.1e-01 1.0e+00 ▁▁▁▁▇
diet_Ash_copper 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
diet_Ash_iron 1 0 9.8e-01 0.02 7.9e-01 1.0e+00 ▁▁▁▁▇
diet_Ash_iron 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
diet_Ash_zinc 1 0 9.8e-01 0.04 4.7e-01 1.0e+00 ▁▁▁▁▇
diet_Ash_zinc 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
diet_Ash_manganese 1 0 9.9e-01 0.06 2.4e-01 1.0e+00 ▁▁▁▁▇
diet_Ash_manganese 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
diet_Ash_iodine 1 0 9.9e-01 0.08 0.0e+00 1.0e+00 ▁▁▁▁▇
diet_Ash_iodine 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
diet_Ash_ca_p 1 0 8.4e-01 0.02 6.9e-01 8.6e-01 ▁▁▁▅▇
diet_Ash_ca_p 2 0 8.1e-01 0.00 8.1e-01 8.1e-01 ▁▁▇▁▁
diet_Vitamins_vit_a_iu 1 0 2.5e-01 0.02 2.3e-01 2.7e-01 ▅▁▁▁▇
diet_Vitamins_vit_a_iu 2 0 2.3e-01 0.00 2.3e-01 2.3e-01 ▁▁▇▁▁
diet_Vitamins_vit_d3 1 0 9.8e-01 0.02 7.3e-01 9.8e-01 ▁▁▁▁▇
diet_Vitamins_vit_d3 2 0 9.8e-01 0.00 9.8e-01 9.8e-01 ▁▁▇▁▁
diet_Vitamins_vit_e 1 0 9.3e-01 0.10 6.4e-01 1.0e+00 ▁▁▅▁▇
diet_Vitamins_vit_e 2 0 8.0e-01 0.00 8.0e-01 8.0e-01 ▁▁▇▁▁
diet_Vitamins_vit_k 1 0 9.7e-01 0.04 4.0e-01 9.8e-01 ▁▁▁▁▇
diet_Vitamins_vit_k 2 0 9.6e-01 0.00 9.6e-01 9.6e-01 ▁▁▇▁▁
diet_Vitamins_vit_b1_thiamin 1 0 9.8e-01 0.06 2.8e-01 9.9e-01 ▁▁▁▁▇
diet_Vitamins_vit_b1_thiamin 2 0 9.8e-01 0.00 9.8e-01 9.8e-01 ▁▁▇▁▁
diet_Vitamins_vit_b2_riboflavin 1 0 9.0e-01 0.03 6.8e-01 9.4e-01 ▁▁▁▇▅
diet_Vitamins_vit_b2_riboflavin 2 0 9.4e-01 0.00 9.4e-01 9.4e-01 ▁▁▇▁▁
diet_Vitamins_vit_b3_niacin 1 0 9.9e-01 0.04 4.9e-01 1.0e+00 ▁▁▁▁▇
diet_Vitamins_vit_b3_niacin 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
diet_Vitamins_choline 1 0 5.0e-01 0.01 4.6e-01 5.2e-01 ▁▁▇▁▅
diet_Vitamins_choline 2 0 5.2e-01 0.00 5.2e-01 5.2e-01 ▁▁▇▁▁
diet_Vitamins_vit_b5_pantothenic_acid 1 0 9.2e-01 0.04 3.9e-01 9.4e-01 ▁▁▁▁▇
diet_Vitamins_vit_b5_pantothenic_acid 2 0 9.4e-01 0.00 9.4e-01 9.4e-01 ▁▁▇▁▁
diet_Vitamins_vit_b6_pyridoxine 1 0 9.6e-01 0.05 3.5e-01 9.6e-01 ▁▁▁▁▇
diet_Vitamins_vit_b6_pyridoxine 2 0 9.6e-01 0.00 9.6e-01 9.6e-01 ▁▁▇▁▁
diet_Vitamins_vit_b7_biotin 1 0 9.9e-01 0.02 7.2e-01 1.0e+00 ▁▁▁▁▇
diet_Vitamins_vit_b7_biotin 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
diet_Vitamins_folic_acid 1 0 9.9e-01 0.07 5.0e-02 1.0e+00 ▁▁▁▁▇
diet_Vitamins_folic_acid 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
diet_Vitamins_vit_b12 1 0 4.9e-01 0.07 4.5e-01 1.0e+00 ▇▅▁▁▁
diet_Vitamins_vit_b12 2 0 5.6e-01 0.00 5.6e-01 5.6e-01 ▁▁▇▁▁
diet_Vitamins_vit_c 1 0 9.7e-01 0.04 6.5e-01 1.0e+00 ▁▁▁▁▇
diet_Vitamins_vit_c 2 0 9.3e-01 0.00 9.3e-01 9.3e-01 ▁▁▇▁▁
diet_Vitamins_beta_carotene 1 0 2.1e-01 0.02 1.8e-01 2.4e-01 ▅▁▁▇▁
diet_Vitamins_beta_carotene 2 0 1.8e-01 0.00 1.8e-01 1.8e-01 ▁▁▇▁▁
diet_Vitamins_lycopene 1 0 4.0e-01 0.06 3.2e-01 6.5e-01 ▅▇▁▁▁
diet_Vitamins_lycopene 2 0 3.2e-01 0.00 3.2e-01 3.2e-01 ▁▁▇▁▁
view_tree(phylo_pruned) + ggtitle("Species-Level OTUs after Filtering")

Collapse Taxa to Genus Level

Collapsing at genus level reduces complexity and allows genus‐scale ecological patterns to emerge with less interference from random error at the species-assignment level.

phylo_genus <- phylo_pruned %>% tax_glom("Genus")
skim_phyloseq(phylo_genus)
Data summary
Name Piped data
Number of rows 270270
Number of columns 86
_______________________
Column type frequency:
character 8
numeric 77
________________________
Group variables subject

Variable type: character

skim_variable subject n_missing min max empty n_unique whitespace
OTU 1 0 6 11 0 702 0
OTU 2 0 6 11 0 702 0
Sample 1 0 6 8 0 166 0
Sample 2 0 8 10 0 219 0
Kingdom 1 0 11 11 0 1 0
Kingdom 2 0 11 11 0 1 0
Phylum 1 0 13 29 0 25 0
Phylum 2 0 13 29 0 25 0
Class 1 0 3 24 0 51 0
Class 2 0 3 24 0 51 0
Order 1 0 3 26 0 105 0
Order 2 0 3 26 0 105 0
Family 1 0 3 32 0 218 0
Family 2 0 3 32 0 218 0
Genus 1 0 3 26 0 699 0
Genus 2 0 3 26 0 699 0

Variable type: numeric

skim_variable subject n_missing mean sd p0 p100 hist
Abundance 1 0 1.1e+01 135.14 0.0e+00 7.8e+03 ▇▁▁▁▁
Abundance 2 0 9.1e+00 119.98 0.0e+00 9.2e+03 ▇▁▁▁▁
subject_sex 1 0 2.0e+00 0.00 2.0e+00 2.0e+00 ▁▁▇▁▁
subject_sex 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
subject_day 1 0 8.4e+01 47.92 1.0e+00 1.7e+02 ▇▇▇▇▇
subject_day 2 0 2.8e+02 63.22 1.7e+02 3.8e+02 ▇▇▇▇▇
collection_day 1 0 1.0e+02 62.09 1.0e+00 4.2e+02 ▇▇▂▁▁
collection_day 2 0 1.6e+02 95.94 1.0e+00 3.3e+02 ▇▇▇▆▇
collection_date 1 0 2.0e+04 62.09 2.0e+04 2.0e+04 ▇▇▂▁▁
collection_date 2 0 2.0e+04 95.94 2.0e+04 2.0e+04 ▇▇▇▆▇
environment_holding 1 0 1.6e+00 0.48 1.0e+00 2.0e+00 ▅▁▁▁▇
environment_holding 2 0 1.4e+00 0.49 1.0e+00 2.0e+00 ▇▁▁▁▆
environment_pair_access 1 0 1.1e+00 0.29 1.0e+00 2.0e+00 ▇▁▁▁▁
environment_pair_access 2 0 1.1e+00 0.22 1.0e+00 2.0e+00 ▇▁▁▁▁
repro_warb_status 1 0 1.4e+00 0.73 1.0e+00 3.0e+00 ▇▁▁▁▂
repro_warb_status 2 0 2.0e+00 0.96 1.0e+00 3.0e+00 ▇▁▂▁▇
bristol_min 1 2808 3.1e+00 1.02 0.0e+00 6.0e+00 ▁▂▇▁▂
bristol_min 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
bristol_mean 1 0 3.5e+00 1.17 0.0e+00 6.0e+00 ▁▃▇▃▂
bristol_mean 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
bristol_max 1 2808 3.8e+00 1.55 0.0e+00 6.0e+00 ▁▃▇▁▆
bristol_max 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
supplement_probiotic 1 0 7.1e-01 0.44 0.0e+00 1.0e+00 ▃▁▁▁▇
supplement_probiotic 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
supplement_steroid 1 0 7.0e-01 0.43 0.0e+00 1.0e+00 ▃▁▂▁▇
supplement_steroid 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
supplement_fiber 1 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
supplement_fiber 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
supplement_antibiotic 1 0 2.0e-02 0.13 0.0e+00 1.0e+00 ▇▁▁▁▁
supplement_antibiotic 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
supplement_antidiarrheal 1 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
supplement_antidiarrheal 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_name 1 0 1.7e+00 0.49 1.0e+00 3.0e+00 ▅▁▇▁▁
diet_name 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
diet_Total_total 1 0 6.0e-01 0.04 5.4e-01 7.3e-01 ▅▁▇▁▁
diet_Total_total 2 0 5.4e-01 0.00 5.4e-01 5.4e-01 ▁▁▇▁▁
diet_Protein_total 1 0 6.7e-01 0.02 6.0e-01 6.9e-01 ▁▁▁▇▅
diet_Protein_total 2 0 6.9e-01 0.00 6.9e-01 6.9e-01 ▁▁▇▁▁
diet_Fat_total 1 0 6.2e-01 0.01 6.1e-01 7.0e-01 ▇▅▁▁▁
diet_Fat_total 2 0 6.3e-01 0.00 6.3e-01 6.3e-01 ▁▁▇▁▁
diet_CHO_by_diff_total 1 0 3.4e-01 0.04 2.9e-01 6.0e-01 ▅▇▁▁▁
diet_CHO_by_diff_total 2 0 2.9e-01 0.00 2.9e-01 2.9e-01 ▁▁▇▁▁
diet_Ash_total 1 0 1.0e+00 0.02 7.9e-01 1.0e+00 ▁▁▁▁▇
diet_Ash_total 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
diet_Total_dry_matter 1 0 5.6e-01 0.01 5.3e-01 5.6e-01 ▁▁▁▅▇
diet_Total_dry_matter 2 0 5.5e-01 0.00 5.5e-01 5.5e-01 ▁▁▇▁▁
diet_Total_kcal 1 0 9.7e-01 0.00 9.7e-01 9.7e-01 ▁▁▇▁▁
diet_Total_kcal 2 0 9.7e-01 0.00 9.7e-01 9.7e-01 ▁▁▇▁▁
diet_Foods_biscuit_rotation 1 0 2.3e-01 0.02 0.0e+00 2.5e-01 ▁▁▁▁▇
diet_Foods_biscuit_rotation 2 0 2.5e-01 0.00 2.5e-01 2.5e-01 ▁▁▇▁▁
diet_Foods_invertebrate_misc 1 0 1.5e-01 0.03 1.3e-01 2.6e-01 ▇▁▅▁▁
diet_Foods_invertebrate_misc 2 0 1.9e-01 0.00 1.9e-01 1.9e-01 ▁▁▇▁▁
diet_Foods_mazuri_enrich_gum_arabic_5b35 1 0 2.1e-01 0.01 2.0e-01 2.4e-01 ▇▁▁▅▁
diet_Foods_mazuri_enrich_gum_arabic_5b35 2 0 2.3e-01 0.00 2.3e-01 2.3e-01 ▁▁▇▁▁
diet_Foods_protein_rotation 1 0 4.0e-02 0.00 4.0e-02 7.0e-02 ▇▁▁▁▁
diet_Foods_protein_rotation 2 0 4.0e-02 0.00 4.0e-02 4.0e-02 ▁▁▇▁▁
diet_Foods_seasonal_vegetables 1 0 3.2e-01 0.02 2.9e-01 4.3e-01 ▅▇▁▁▁
diet_Foods_seasonal_vegetables 2 0 2.9e-01 0.00 2.9e-01 2.9e-01 ▁▁▇▁▁
diet_Foods_egg_whole_cooked_meat_prep 1 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_egg_whole_cooked_meat_prep 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_potato_sweet 1 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_potato_sweet 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_bean_green_fresh 1 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_bean_green_fresh 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_carrot 1 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_carrot 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_pumpkin_canned 1 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_pumpkin_canned 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_egg_whole_raw_meat_prep 1 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_egg_whole_raw_meat_prep 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_seasonal_vegetables_root 1 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_seasonal_vegetables_root 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_seasonal_vegetables_non_root 1 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_seasonal_vegetables_non_root 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_egg_white_only_cooked 1 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_egg_white_only_cooked 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_potato_sweet_cooked 1 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_potato_sweet_cooked 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_celery 1 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_celery 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_lettuce_romaine 1 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_lettuce_romaine 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_ohdz_oatmeal_gel 1 0 5.0e-02 0.04 0.0e+00 8.0e-02 ▅▁▁▁▇
diet_Foods_ohdz_oatmeal_gel 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Protein_taurine 1 0 9.9e-01 0.08 0.0e+00 1.0e+00 ▁▁▁▁▇
diet_Protein_taurine 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
diet_Protein_methionine 1 0 4.4e-01 0.01 3.2e-01 4.5e-01 ▁▁▁▁▇
diet_Protein_methionine 2 0 4.5e-01 0.00 4.5e-01 4.5e-01 ▁▁▇▁▁
diet_Fat_omega_3_ala__epa__dha 1 0 9.9e-01 0.08 0.0e+00 1.0e+00 ▁▁▁▁▇
diet_Fat_omega_3_ala__epa__dha 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
diet_Fat_omega_6_la__gla__aa 1 0 9.9e-01 0.08 0.0e+00 1.0e+00 ▁▁▁▁▇
diet_Fat_omega_6_la__gla__aa 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
diet_CHO_by_diff_starch 1 0 9.5e-01 0.07 3.8e-01 1.0e+00 ▁▁▁▁▇
diet_CHO_by_diff_starch 2 0 8.8e-01 0.00 8.8e-01 8.8e-01 ▁▁▇▁▁
diet_CHO_by_diff_ndf 1 0 7.8e-01 0.01 7.5e-01 7.8e-01 ▁▁▅▁▇
diet_CHO_by_diff_ndf 2 0 7.7e-01 0.00 7.7e-01 7.7e-01 ▁▁▇▁▁
diet_CHO_by_diff_adf 1 0 9.9e-01 0.05 3.1e-01 1.0e+00 ▁▁▁▁▇
diet_CHO_by_diff_adf 2 0 9.7e-01 0.00 9.7e-01 9.7e-01 ▁▁▇▁▁
diet_CHO_by_diff_crude_fiber 1 0 5.7e-01 0.01 5.7e-01 7.1e-01 ▇▁▁▁▁
diet_CHO_by_diff_crude_fiber 2 0 5.7e-01 0.00 5.7e-01 5.7e-01 ▁▁▇▁▁
diet_CHO_by_diff_tdf 1 0 4.1e-01 0.04 3.8e-01 7.6e-01 ▇▁▁▁▁
diet_CHO_by_diff_tdf 2 0 3.8e-01 0.00 3.8e-01 3.8e-01 ▁▁▇▁▁
diet_Ash_calcium 1 0 9.6e-01 0.01 7.7e-01 9.7e-01 ▁▁▁▁▇
diet_Ash_calcium 2 0 9.7e-01 0.00 9.7e-01 9.7e-01 ▁▁▇▁▁
diet_Ash_phosphorus 1 0 9.6e-01 0.03 9.4e-01 1.0e+00 ▇▁▁▁▅
diet_Ash_phosphorus 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
diet_Ash_potassium 1 0 8.8e-01 0.00 8.8e-01 9.1e-01 ▇▁▁▁▁
diet_Ash_potassium 2 0 8.8e-01 0.00 8.8e-01 8.8e-01 ▁▁▇▁▁
diet_Ash_magnesium 1 0 5.0e-01 0.05 4.4e-01 7.2e-01 ▅▇▁▁▁
diet_Ash_magnesium 2 0 4.4e-01 0.00 4.4e-01 4.4e-01 ▁▁▇▁▁
diet_Ash_copper 1 0 9.9e-01 0.05 3.1e-01 1.0e+00 ▁▁▁▁▇
diet_Ash_copper 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
diet_Ash_iron 1 0 9.8e-01 0.02 7.9e-01 1.0e+00 ▁▁▁▁▇
diet_Ash_iron 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
diet_Ash_zinc 1 0 9.8e-01 0.04 4.7e-01 1.0e+00 ▁▁▁▁▇
diet_Ash_zinc 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
diet_Ash_manganese 1 0 9.9e-01 0.06 2.4e-01 1.0e+00 ▁▁▁▁▇
diet_Ash_manganese 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
diet_Ash_iodine 1 0 9.9e-01 0.08 0.0e+00 1.0e+00 ▁▁▁▁▇
diet_Ash_iodine 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
diet_Ash_ca_p 1 0 8.4e-01 0.02 6.9e-01 8.6e-01 ▁▁▁▅▇
diet_Ash_ca_p 2 0 8.1e-01 0.00 8.1e-01 8.1e-01 ▁▁▇▁▁
diet_Vitamins_vit_a_iu 1 0 2.5e-01 0.02 2.3e-01 2.7e-01 ▅▁▁▁▇
diet_Vitamins_vit_a_iu 2 0 2.3e-01 0.00 2.3e-01 2.3e-01 ▁▁▇▁▁
diet_Vitamins_vit_d3 1 0 9.8e-01 0.02 7.3e-01 9.8e-01 ▁▁▁▁▇
diet_Vitamins_vit_d3 2 0 9.8e-01 0.00 9.8e-01 9.8e-01 ▁▁▇▁▁
diet_Vitamins_vit_e 1 0 9.3e-01 0.10 6.4e-01 1.0e+00 ▁▁▅▁▇
diet_Vitamins_vit_e 2 0 8.0e-01 0.00 8.0e-01 8.0e-01 ▁▁▇▁▁
diet_Vitamins_vit_k 1 0 9.7e-01 0.04 4.0e-01 9.8e-01 ▁▁▁▁▇
diet_Vitamins_vit_k 2 0 9.6e-01 0.00 9.6e-01 9.6e-01 ▁▁▇▁▁
diet_Vitamins_vit_b1_thiamin 1 0 9.8e-01 0.06 2.8e-01 9.9e-01 ▁▁▁▁▇
diet_Vitamins_vit_b1_thiamin 2 0 9.8e-01 0.00 9.8e-01 9.8e-01 ▁▁▇▁▁
diet_Vitamins_vit_b2_riboflavin 1 0 9.0e-01 0.03 6.8e-01 9.4e-01 ▁▁▁▇▅
diet_Vitamins_vit_b2_riboflavin 2 0 9.4e-01 0.00 9.4e-01 9.4e-01 ▁▁▇▁▁
diet_Vitamins_vit_b3_niacin 1 0 9.9e-01 0.04 4.9e-01 1.0e+00 ▁▁▁▁▇
diet_Vitamins_vit_b3_niacin 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
diet_Vitamins_choline 1 0 5.0e-01 0.01 4.6e-01 5.2e-01 ▁▁▇▁▅
diet_Vitamins_choline 2 0 5.2e-01 0.00 5.2e-01 5.2e-01 ▁▁▇▁▁
diet_Vitamins_vit_b5_pantothenic_acid 1 0 9.2e-01 0.04 3.9e-01 9.4e-01 ▁▁▁▁▇
diet_Vitamins_vit_b5_pantothenic_acid 2 0 9.4e-01 0.00 9.4e-01 9.4e-01 ▁▁▇▁▁
diet_Vitamins_vit_b6_pyridoxine 1 0 9.6e-01 0.05 3.5e-01 9.6e-01 ▁▁▁▁▇
diet_Vitamins_vit_b6_pyridoxine 2 0 9.6e-01 0.00 9.6e-01 9.6e-01 ▁▁▇▁▁
diet_Vitamins_vit_b7_biotin 1 0 9.9e-01 0.02 7.2e-01 1.0e+00 ▁▁▁▁▇
diet_Vitamins_vit_b7_biotin 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
diet_Vitamins_folic_acid 1 0 9.9e-01 0.07 5.0e-02 1.0e+00 ▁▁▁▁▇
diet_Vitamins_folic_acid 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
diet_Vitamins_vit_b12 1 0 4.9e-01 0.07 4.5e-01 1.0e+00 ▇▅▁▁▁
diet_Vitamins_vit_b12 2 0 5.6e-01 0.00 5.6e-01 5.6e-01 ▁▁▇▁▁
diet_Vitamins_vit_c 1 0 9.7e-01 0.04 6.5e-01 1.0e+00 ▁▁▁▁▇
diet_Vitamins_vit_c 2 0 9.3e-01 0.00 9.3e-01 9.3e-01 ▁▁▇▁▁
diet_Vitamins_beta_carotene 1 0 2.1e-01 0.02 1.8e-01 2.4e-01 ▅▁▁▇▁
diet_Vitamins_beta_carotene 2 0 1.8e-01 0.00 1.8e-01 1.8e-01 ▁▁▇▁▁
diet_Vitamins_lycopene 1 0 4.0e-01 0.06 3.2e-01 6.5e-01 ▅▇▁▁▁
diet_Vitamins_lycopene 2 0 3.2e-01 0.00 3.2e-01 3.2e-01 ▁▁▇▁▁
view_tree(phylo_genus) + ggtitle("Genus-Level OTUs")

Another Pruning Check

Let’s look at our OTUs now that we merged to the Genus level

rare_genera <- names(taxa_sums(phylo_genus)[taxa_sums(phylo_genus) <= 2])
keep_genera <- names(taxa_sums(phylo_genus)[taxa_sums(phylo_genus) > 2])
length(rare_genera)
[1] 89
length(keep_genera)
[1] 613

Let’s do one more pruning step to only keep the genera with total abundances greater than 2 (613 genera total).

phylo_clean <- prune_taxa(keep_genera, phylo_genus)
skim_phyloseq(phylo_clean)
Data summary
Name Piped data
Number of rows 236005
Number of columns 86
_______________________
Column type frequency:
character 8
numeric 77
________________________
Group variables subject

Variable type: character

skim_variable subject n_missing min max empty n_unique whitespace
OTU 1 0 6 11 0 613 0
OTU 2 0 6 11 0 613 0
Sample 1 0 6 8 0 166 0
Sample 2 0 8 10 0 219 0
Kingdom 1 0 11 11 0 1 0
Kingdom 2 0 11 11 0 1 0
Phylum 1 0 13 29 0 23 0
Phylum 2 0 13 29 0 23 0
Class 1 0 3 24 0 50 0
Class 2 0 3 24 0 50 0
Order 1 0 3 26 0 98 0
Order 2 0 3 26 0 98 0
Family 1 0 3 32 0 198 0
Family 2 0 3 32 0 198 0
Genus 1 0 3 25 0 611 0
Genus 2 0 3 25 0 611 0

Variable type: numeric

skim_variable subject n_missing mean sd p0 p100 hist
Abundance 1 0 1.2e+01 144.55 0.0e+00 7.8e+03 ▇▁▁▁▁
Abundance 2 0 1.0e+01 128.35 0.0e+00 9.2e+03 ▇▁▁▁▁
subject_sex 1 0 2.0e+00 0.00 2.0e+00 2.0e+00 ▁▁▇▁▁
subject_sex 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
subject_day 1 0 8.4e+01 47.92 1.0e+00 1.7e+02 ▇▇▇▇▇
subject_day 2 0 2.8e+02 63.22 1.7e+02 3.8e+02 ▇▇▇▇▇
collection_day 1 0 1.0e+02 62.09 1.0e+00 4.2e+02 ▇▇▂▁▁
collection_day 2 0 1.6e+02 95.94 1.0e+00 3.3e+02 ▇▇▇▆▇
collection_date 1 0 2.0e+04 62.09 2.0e+04 2.0e+04 ▇▇▂▁▁
collection_date 2 0 2.0e+04 95.94 2.0e+04 2.0e+04 ▇▇▇▆▇
environment_holding 1 0 1.6e+00 0.48 1.0e+00 2.0e+00 ▅▁▁▁▇
environment_holding 2 0 1.4e+00 0.49 1.0e+00 2.0e+00 ▇▁▁▁▆
environment_pair_access 1 0 1.1e+00 0.29 1.0e+00 2.0e+00 ▇▁▁▁▁
environment_pair_access 2 0 1.1e+00 0.22 1.0e+00 2.0e+00 ▇▁▁▁▁
repro_warb_status 1 0 1.4e+00 0.73 1.0e+00 3.0e+00 ▇▁▁▁▂
repro_warb_status 2 0 2.0e+00 0.96 1.0e+00 3.0e+00 ▇▁▂▁▇
bristol_min 1 2452 3.1e+00 1.02 0.0e+00 6.0e+00 ▁▂▇▁▂
bristol_min 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
bristol_mean 1 0 3.5e+00 1.17 0.0e+00 6.0e+00 ▁▃▇▃▂
bristol_mean 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
bristol_max 1 2452 3.8e+00 1.55 0.0e+00 6.0e+00 ▁▃▇▁▆
bristol_max 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
supplement_probiotic 1 0 7.1e-01 0.44 0.0e+00 1.0e+00 ▃▁▁▁▇
supplement_probiotic 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
supplement_steroid 1 0 7.0e-01 0.43 0.0e+00 1.0e+00 ▃▁▂▁▇
supplement_steroid 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
supplement_fiber 1 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
supplement_fiber 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
supplement_antibiotic 1 0 2.0e-02 0.13 0.0e+00 1.0e+00 ▇▁▁▁▁
supplement_antibiotic 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
supplement_antidiarrheal 1 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
supplement_antidiarrheal 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_name 1 0 1.7e+00 0.49 1.0e+00 3.0e+00 ▅▁▇▁▁
diet_name 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
diet_Total_total 1 0 6.0e-01 0.04 5.4e-01 7.3e-01 ▅▁▇▁▁
diet_Total_total 2 0 5.4e-01 0.00 5.4e-01 5.4e-01 ▁▁▇▁▁
diet_Protein_total 1 0 6.7e-01 0.02 6.0e-01 6.9e-01 ▁▁▁▇▅
diet_Protein_total 2 0 6.9e-01 0.00 6.9e-01 6.9e-01 ▁▁▇▁▁
diet_Fat_total 1 0 6.2e-01 0.01 6.1e-01 7.0e-01 ▇▅▁▁▁
diet_Fat_total 2 0 6.3e-01 0.00 6.3e-01 6.3e-01 ▁▁▇▁▁
diet_CHO_by_diff_total 1 0 3.4e-01 0.04 2.9e-01 6.0e-01 ▅▇▁▁▁
diet_CHO_by_diff_total 2 0 2.9e-01 0.00 2.9e-01 2.9e-01 ▁▁▇▁▁
diet_Ash_total 1 0 1.0e+00 0.02 7.9e-01 1.0e+00 ▁▁▁▁▇
diet_Ash_total 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
diet_Total_dry_matter 1 0 5.6e-01 0.01 5.3e-01 5.6e-01 ▁▁▁▅▇
diet_Total_dry_matter 2 0 5.5e-01 0.00 5.5e-01 5.5e-01 ▁▁▇▁▁
diet_Total_kcal 1 0 9.7e-01 0.00 9.7e-01 9.7e-01 ▁▁▇▁▁
diet_Total_kcal 2 0 9.7e-01 0.00 9.7e-01 9.7e-01 ▁▁▇▁▁
diet_Foods_biscuit_rotation 1 0 2.3e-01 0.02 0.0e+00 2.5e-01 ▁▁▁▁▇
diet_Foods_biscuit_rotation 2 0 2.5e-01 0.00 2.5e-01 2.5e-01 ▁▁▇▁▁
diet_Foods_invertebrate_misc 1 0 1.5e-01 0.03 1.3e-01 2.6e-01 ▇▁▅▁▁
diet_Foods_invertebrate_misc 2 0 1.9e-01 0.00 1.9e-01 1.9e-01 ▁▁▇▁▁
diet_Foods_mazuri_enrich_gum_arabic_5b35 1 0 2.1e-01 0.01 2.0e-01 2.4e-01 ▇▁▁▅▁
diet_Foods_mazuri_enrich_gum_arabic_5b35 2 0 2.3e-01 0.00 2.3e-01 2.3e-01 ▁▁▇▁▁
diet_Foods_protein_rotation 1 0 4.0e-02 0.00 4.0e-02 7.0e-02 ▇▁▁▁▁
diet_Foods_protein_rotation 2 0 4.0e-02 0.00 4.0e-02 4.0e-02 ▁▁▇▁▁
diet_Foods_seasonal_vegetables 1 0 3.2e-01 0.02 2.9e-01 4.3e-01 ▅▇▁▁▁
diet_Foods_seasonal_vegetables 2 0 2.9e-01 0.00 2.9e-01 2.9e-01 ▁▁▇▁▁
diet_Foods_egg_whole_cooked_meat_prep 1 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_egg_whole_cooked_meat_prep 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_potato_sweet 1 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_potato_sweet 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_bean_green_fresh 1 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_bean_green_fresh 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_carrot 1 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_carrot 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_pumpkin_canned 1 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_pumpkin_canned 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_egg_whole_raw_meat_prep 1 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_egg_whole_raw_meat_prep 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_seasonal_vegetables_root 1 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_seasonal_vegetables_root 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_seasonal_vegetables_non_root 1 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_seasonal_vegetables_non_root 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_egg_white_only_cooked 1 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_egg_white_only_cooked 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_potato_sweet_cooked 1 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_potato_sweet_cooked 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_celery 1 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_celery 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_lettuce_romaine 1 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_lettuce_romaine 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Foods_ohdz_oatmeal_gel 1 0 5.0e-02 0.04 0.0e+00 8.0e-02 ▅▁▁▁▇
diet_Foods_ohdz_oatmeal_gel 2 0 0.0e+00 0.00 0.0e+00 0.0e+00 ▁▁▇▁▁
diet_Protein_taurine 1 0 9.9e-01 0.08 0.0e+00 1.0e+00 ▁▁▁▁▇
diet_Protein_taurine 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
diet_Protein_methionine 1 0 4.4e-01 0.01 3.2e-01 4.5e-01 ▁▁▁▁▇
diet_Protein_methionine 2 0 4.5e-01 0.00 4.5e-01 4.5e-01 ▁▁▇▁▁
diet_Fat_omega_3_ala__epa__dha 1 0 9.9e-01 0.08 0.0e+00 1.0e+00 ▁▁▁▁▇
diet_Fat_omega_3_ala__epa__dha 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
diet_Fat_omega_6_la__gla__aa 1 0 9.9e-01 0.08 0.0e+00 1.0e+00 ▁▁▁▁▇
diet_Fat_omega_6_la__gla__aa 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
diet_CHO_by_diff_starch 1 0 9.5e-01 0.07 3.8e-01 1.0e+00 ▁▁▁▁▇
diet_CHO_by_diff_starch 2 0 8.8e-01 0.00 8.8e-01 8.8e-01 ▁▁▇▁▁
diet_CHO_by_diff_ndf 1 0 7.8e-01 0.01 7.5e-01 7.8e-01 ▁▁▅▁▇
diet_CHO_by_diff_ndf 2 0 7.7e-01 0.00 7.7e-01 7.7e-01 ▁▁▇▁▁
diet_CHO_by_diff_adf 1 0 9.9e-01 0.05 3.1e-01 1.0e+00 ▁▁▁▁▇
diet_CHO_by_diff_adf 2 0 9.7e-01 0.00 9.7e-01 9.7e-01 ▁▁▇▁▁
diet_CHO_by_diff_crude_fiber 1 0 5.7e-01 0.01 5.7e-01 7.1e-01 ▇▁▁▁▁
diet_CHO_by_diff_crude_fiber 2 0 5.7e-01 0.00 5.7e-01 5.7e-01 ▁▁▇▁▁
diet_CHO_by_diff_tdf 1 0 4.1e-01 0.04 3.8e-01 7.6e-01 ▇▁▁▁▁
diet_CHO_by_diff_tdf 2 0 3.8e-01 0.00 3.8e-01 3.8e-01 ▁▁▇▁▁
diet_Ash_calcium 1 0 9.6e-01 0.01 7.7e-01 9.7e-01 ▁▁▁▁▇
diet_Ash_calcium 2 0 9.7e-01 0.00 9.7e-01 9.7e-01 ▁▁▇▁▁
diet_Ash_phosphorus 1 0 9.6e-01 0.03 9.4e-01 1.0e+00 ▇▁▁▁▅
diet_Ash_phosphorus 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
diet_Ash_potassium 1 0 8.8e-01 0.00 8.8e-01 9.1e-01 ▇▁▁▁▁
diet_Ash_potassium 2 0 8.8e-01 0.00 8.8e-01 8.8e-01 ▁▁▇▁▁
diet_Ash_magnesium 1 0 5.0e-01 0.05 4.4e-01 7.2e-01 ▅▇▁▁▁
diet_Ash_magnesium 2 0 4.4e-01 0.00 4.4e-01 4.4e-01 ▁▁▇▁▁
diet_Ash_copper 1 0 9.9e-01 0.05 3.1e-01 1.0e+00 ▁▁▁▁▇
diet_Ash_copper 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
diet_Ash_iron 1 0 9.8e-01 0.02 7.9e-01 1.0e+00 ▁▁▁▁▇
diet_Ash_iron 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
diet_Ash_zinc 1 0 9.8e-01 0.04 4.7e-01 1.0e+00 ▁▁▁▁▇
diet_Ash_zinc 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
diet_Ash_manganese 1 0 9.9e-01 0.06 2.4e-01 1.0e+00 ▁▁▁▁▇
diet_Ash_manganese 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
diet_Ash_iodine 1 0 9.9e-01 0.08 0.0e+00 1.0e+00 ▁▁▁▁▇
diet_Ash_iodine 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
diet_Ash_ca_p 1 0 8.4e-01 0.02 6.9e-01 8.6e-01 ▁▁▁▅▇
diet_Ash_ca_p 2 0 8.1e-01 0.00 8.1e-01 8.1e-01 ▁▁▇▁▁
diet_Vitamins_vit_a_iu 1 0 2.5e-01 0.02 2.3e-01 2.7e-01 ▅▁▁▁▇
diet_Vitamins_vit_a_iu 2 0 2.3e-01 0.00 2.3e-01 2.3e-01 ▁▁▇▁▁
diet_Vitamins_vit_d3 1 0 9.8e-01 0.02 7.3e-01 9.8e-01 ▁▁▁▁▇
diet_Vitamins_vit_d3 2 0 9.8e-01 0.00 9.8e-01 9.8e-01 ▁▁▇▁▁
diet_Vitamins_vit_e 1 0 9.3e-01 0.10 6.4e-01 1.0e+00 ▁▁▅▁▇
diet_Vitamins_vit_e 2 0 8.0e-01 0.00 8.0e-01 8.0e-01 ▁▁▇▁▁
diet_Vitamins_vit_k 1 0 9.7e-01 0.04 4.0e-01 9.8e-01 ▁▁▁▁▇
diet_Vitamins_vit_k 2 0 9.6e-01 0.00 9.6e-01 9.6e-01 ▁▁▇▁▁
diet_Vitamins_vit_b1_thiamin 1 0 9.8e-01 0.06 2.8e-01 9.9e-01 ▁▁▁▁▇
diet_Vitamins_vit_b1_thiamin 2 0 9.8e-01 0.00 9.8e-01 9.8e-01 ▁▁▇▁▁
diet_Vitamins_vit_b2_riboflavin 1 0 9.0e-01 0.03 6.8e-01 9.4e-01 ▁▁▁▇▅
diet_Vitamins_vit_b2_riboflavin 2 0 9.4e-01 0.00 9.4e-01 9.4e-01 ▁▁▇▁▁
diet_Vitamins_vit_b3_niacin 1 0 9.9e-01 0.04 4.9e-01 1.0e+00 ▁▁▁▁▇
diet_Vitamins_vit_b3_niacin 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
diet_Vitamins_choline 1 0 5.0e-01 0.01 4.6e-01 5.2e-01 ▁▁▇▁▅
diet_Vitamins_choline 2 0 5.2e-01 0.00 5.2e-01 5.2e-01 ▁▁▇▁▁
diet_Vitamins_vit_b5_pantothenic_acid 1 0 9.2e-01 0.04 3.9e-01 9.4e-01 ▁▁▁▁▇
diet_Vitamins_vit_b5_pantothenic_acid 2 0 9.4e-01 0.00 9.4e-01 9.4e-01 ▁▁▇▁▁
diet_Vitamins_vit_b6_pyridoxine 1 0 9.6e-01 0.05 3.5e-01 9.6e-01 ▁▁▁▁▇
diet_Vitamins_vit_b6_pyridoxine 2 0 9.6e-01 0.00 9.6e-01 9.6e-01 ▁▁▇▁▁
diet_Vitamins_vit_b7_biotin 1 0 9.9e-01 0.02 7.2e-01 1.0e+00 ▁▁▁▁▇
diet_Vitamins_vit_b7_biotin 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
diet_Vitamins_folic_acid 1 0 9.9e-01 0.07 5.0e-02 1.0e+00 ▁▁▁▁▇
diet_Vitamins_folic_acid 2 0 1.0e+00 0.00 1.0e+00 1.0e+00 ▁▁▇▁▁
diet_Vitamins_vit_b12 1 0 4.9e-01 0.07 4.5e-01 1.0e+00 ▇▅▁▁▁
diet_Vitamins_vit_b12 2 0 5.6e-01 0.00 5.6e-01 5.6e-01 ▁▁▇▁▁
diet_Vitamins_vit_c 1 0 9.7e-01 0.04 6.5e-01 1.0e+00 ▁▁▁▁▇
diet_Vitamins_vit_c 2 0 9.3e-01 0.00 9.3e-01 9.3e-01 ▁▁▇▁▁
diet_Vitamins_beta_carotene 1 0 2.1e-01 0.02 1.8e-01 2.4e-01 ▅▁▁▇▁
diet_Vitamins_beta_carotene 2 0 1.8e-01 0.00 1.8e-01 1.8e-01 ▁▁▇▁▁
diet_Vitamins_lycopene 1 0 4.0e-01 0.06 3.2e-01 6.5e-01 ▅▇▁▁▁
diet_Vitamins_lycopene 2 0 3.2e-01 0.00 3.2e-01 3.2e-01 ▁▁▇▁▁
view_tree(phylo_clean) + ggtitle("Genus-Level OTUs")

Extract and Save Clean Phyloseq Objects

Exporting intermediate objects saves time if you need to re‐run later steps without re‐processing.

phylo_melt_clean     <- psmelt(phylo_clean)
clean_tree           <- phy_tree(phylo_clean)
save(phylo_clean     , file = "microeco/loris/phyloseq_genus.RData")
save(clean_tree      , file = "microeco/loris/tree_genus.RData")
save(phylo_melt_clean, file = "microeco/loris/phyloseq_melt_genus.RData")

Subset Additional Taxonomic Levels

Working at multiple ranks lets you compare community structure from broad (Phylum) to fine (Genus) scales in the same pipeline.

fam_phylo <- phylo_clean %>% tax_glom("Family")
ord_phylo <- phylo_clean %>% tax_glom("Order")
cla_phylo <- phylo_clean %>% tax_glom("Class")
phy_phylo <- phylo_clean %>% tax_glom("Phylum")

view_tree(fam_phylo) + ggtitle("Family-Level OTUs") 

view_tree(ord_phylo) + ggtitle("Order-Level OTUs")

view_tree(cla_phylo, "Class") + ggtitle("Class-Level OTUs") + 
      coord_cartesian(clip = "off") + 
      theme(plot.margin = margin(5, 65, 5, 5, "pt"))

view_tree(phy_phylo, "Phylum") + ggtitle("Phylum-Level OTUs") +  
      coord_cartesian(clip = "off") + 
      theme(plot.margin = margin(5, 65, 5, 5, "pt"))

Extract and Save for Other Levels

fam_phylo_melt     <- psmelt(fam_phylo)
ord_phylo_melt     <- psmelt(ord_phylo)
cla_phylo_melt     <- psmelt(cla_phylo)
phy_phylo_melt     <- psmelt(phy_phylo)

fam_tree           <- phy_tree(fam_phylo)
ord_tree           <- phy_tree(ord_phylo)
cla_tree           <- phy_tree(cla_phylo)
phy_tree           <- phy_tree(phy_phylo)

save(fam_phylo     , file = "microeco/loris/phyloseq_family.RData")
save(ord_phylo     , file = "microeco/loris/phyloseq_order.RData")
save(cla_phylo     , file = "microeco/loris/phyloseq_class.RData")
save(phy_phylo     , file = "microeco/loris/phyloseq_phylum.RData")

save(fam_tree      , file = "microeco/loris/tree_family.RData")
save(ord_tree      , file = "microeco/loris/tree_order.RData")
save(cla_tree      , file = "microeco/loris/tree_class.RData")
save(phy_tree      , file = "microeco/loris/tree_phylum.RData")

save(fam_phylo_melt, file = "microeco/loris/phyloseq_melt_family.RData")
save(ord_phylo_melt, file = "microeco/loris/phyloseq_melt_order.RData")
save(cla_phylo_melt, file = "microeco/loris/phyloseq_melt_class.RData")
save(phy_phylo_melt, file = "microeco/loris/phyloseq_melt_phylum.RData")

Next Steps

In the microbiome_metrics tutorial you will learn how to choose and apply rarefaction or relative-abundance normalization, and then calculate fundamental diversity statistics (α-diversity indices, β-diversity distances, UniFrac, etc.). Refer to that section to decide when and how to rarefy your merged tables, or to work directly on normalized counts for non-phylogenetic metrics.

LS0tCnRpdGxlOiAiUHJlcHJvY2Vzc2luZyBNaWNyb2Jpb21lIERhdGEgd2l0aCBQaHlsb3NlcSIKYXV0aG9yOiAiQWxpY2lhIE0uIFJpY2gsIFBoLkQuIgpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgdGhlbWU6CiAgICAgIGJzbGliOiB0cnVlCiAgICB0b2M6IHRydWUKICAgIHRvY19kZXB0aDogMwogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICBkZl9wcmludDoga2FibGUKICAgIGNzczogam91cm5hbC5jc3MKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0KbGlicmFyeShjb25mbGljdGVkKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShzZXFpbnIpCmxpYnJhcnkoYXBlKQpsaWJyYXJ5KHRyZWVkYXRhdmVyc2UpCmxpYnJhcnkocGh5bG9zZXEpCmxpYnJhcnkoQmlvc3RyaW5ncykKbGlicmFyeShwYWxldHRlZXIpCmxpYnJhcnkoc2tpbXIpCgpzb3VyY2UoInNldHVwL2NvbmZsaWN0ZWQuUiIpCgoKa25pdHI6Om9wdHNfY2h1bmskc2V0KAogIG1lc3NhZ2UgICAgICAgPSBGQUxTRSwKICB3YXJuaW5nICAgICAgID0gRkFMU0UsCiAgZWNobyAgICAgICAgICA9IFRSVUUsCiAgaW5jbHVkZSAgICAgICA9IFRSVUUsCiAgZXZhbCAgICAgICAgICA9IFRSVUUsCiAgY29tbWVudCAgICAgICA9ICIiICAsCiAgZGZfcHJpbnQgICAgICA9ICJrYWJsZSIsCiAgc2tpbXJfZGlnaXRzICA9IDIgICAgICAgICkKCmtuaXRyOjpvcHRzX2tuaXQkc2V0KAogIG1lc3NhZ2UgICAgICAgPSBGQUxTRSwKICB3YXJuaW5nICAgICAgID0gRkFMU0UsCiAgZWNobyAgICAgICAgICA9IFRSVUUsCiAgaW5jbHVkZSAgICAgICA9IFRSVUUsCiAgZXZhbCAgICAgICAgICA9IFRSVUUsCiAgY29tbWVudCAgICAgICA9ICIiICAsCiAgZGZfcHJpbnQgICAgICA9ICJrYWJsZSIsCiAgc2tpbXJfZGlnaXRzICA9IDIgICAgICAgIAogICkKYGBgCgoKIyBQcmVwcm9jZXNzaW5nIE92ZXJ2aWV3CgpJbiB0aGlzIHNlY3Rpb24gd2Ugd2lsbCB0YWtlIHJhdyBtaWNyb2Jpb21lIGNvdW50IGRhdGEgYW5kIHR1cm4gaXQgaW50byBhIGNsZWFuLCBhbmFseXNpcy1yZWFkeSBgcGh5bG9zZXFgIG9iamVjdC4gIFlvdSB3aWxsOgoKMS4JKipMb2FkIHlvdXIgY29yZSBpbnB1dHMqKgoKICAtIEEgcm9vdGVkIHBoeWxvZ2VuZXRpYyB0cmVlIChgcmVmc190cmVlLnRyZWVmaWxlYCkKICAgIC0gcHJvZHVjZWQgaW4gdGhlIFtgbWljcm9iaW9tZV9yZWZlcmVuY2VzYCB0dXRvcmlhbF0oaHR0cHM6Ly9yaWNoLW1vbGVjdWxhci1oZWFsdGgtbGFiLmdpdGh1Yi5pby90dXRvcmlhbHMvbWljcm9iaW9tZV9yZWZlcmVuY2VzLmh0bWwpLgogIC0gUmVwcmVzZW50YXRpdmUgMTZTIHNlcXVlbmNlcyAoYHJlZnNfYWxpZ25lZF9tYWZmdC5mYXN0YWApCiAgICAtIHByb2R1Y2VkIGluIHRoZSBbYG1pY3JvYmlvbWVfcmVmZXJlbmNlc2AgdHV0b3JpYWxdKGh0dHBzOi8vcmljaC1tb2xlY3VsYXItaGVhbHRoLWxhYi5naXRodWIuaW8vdHV0b3JpYWxzL21pY3JvYmlvbWVfcmVmZXJlbmNlcy5odG1sKS4KICAtIEEgdGF4b25vbWljIGFzc2lnbm1lbnQgdGFibGUgKGB0YXhfdGFibGUuUkRhdGFgKQogICAgLSBwcm9kdWNlZCBpbiB0aGUgW2BtaWNyb2Jpb21lX2FsaWdubWVudHNgIHR1dG9yaWFsXShodHRwczovL3JpY2gtbW9sZWN1bGFyLWhlYWx0aC1sYWIuZ2l0aHViLmlvL3R1dG9yaWFscy9taWNyb2Jpb21lX2FsaWdubWVudHMuaHRtbCkuCiAgLSBTYW1wbGUgbWV0YWRhdGEgKGBzYW1wbGVfdGFibGUuUkRhdGFgKQogICAgLSBwcm9kdWNlZCBpbiB0aGUgW2BtZXRhZGF0YV9zZXR1cGAgdHV0b3JpYWxdKGh0dHBzOi8vcmljaC1tb2xlY3VsYXItaGVhbHRoLWxhYi5naXRodWIuaW8vdHV0b3JpYWxzL21ldGFkYXRhX3NldHVwLmh0bWwpIGFuZCB0aGVuIHByZXBhcmVkIGZvciBtaWNyb2Jpb21lcyBpbiBbYG1pY3JvYmlvbWVfYWxpZ25tZW50c2BdKChodHRwczovL3JpY2gtbW9sZWN1bGFyLWhlYWx0aC1sYWIuZ2l0aHViLmlvL3R1dG9yaWFscy9taWNyb2Jpb21lX2FsaWdubWVudHMuaHRtbCkuCiAgLSBBbiBPVFUgY291bnQgdGFibGUgKGBvdHVfdGFibGUuUkRhdGFgKQogICAgLSBwcm9kdWNlZCBpbiB0aGUgW2BtaWNyb2Jpb21lX2FsaWdubWVudHNgIHR1dG9yaWFsXShodHRwczovL3JpY2gtbW9sZWN1bGFyLWhlYWx0aC1sYWIuZ2l0aHViLmlvL3R1dG9yaWFscy9taWNyb2Jpb21lX2FsaWdubWVudHMuaHRtbCkuCgkKMi4JKipNZXJnZSByZXBsaWNhdGUgc2FtcGxlcyoqCgogIC0gUG9vbCBhbGwgcmVhZHMgZm9yIHRoZSBzYW1lIHN1YmplY3Qgb24gdGhlIHNhbWUgZGF5IGludG8gYSBzaW5nbGUgc2FtcGxlLiAgT1RVIGNvdW50cyBhcmUgc3VtbWVkLCBhbmQgbnVtZXJpYyBtZXRhZGF0YSBhcmUgYXZlcmFnZWQuCgozLgkqKkNsZWFuIHVwIHRheG9ub215ICYgcHJ1bmUqKgoKICAtIFJlbmFtZSBlYWNoIHRpcCB0byBhIHNpbXBsZSDigJxPVFUx4oCmT1RVbuKAnSBsYWJlbAogIC0gUmVtb3ZlIHZlcnkgbG93LWFidW5kYW5jZSBPVFVzIChlLmcuIHRvdGFsIGNvdW50IOKJpCAxKQogIC0gQ29sbGFwc2UgeW91ciBjb3VudCB0YWJsZSBhbmQgdHJlZSB0byB0aGUgR2VudXMgcmFuawogIC0gUGVyZm9ybSBhIHNlY29uZCBwcnVuaW5nIHN0ZXAgc28gdGhhdCBvbmx5IGdlbmVyYSB3aXRoIG1lYW5pbmdmdWwgY291bnRzIHJlbWFpbgoKNC4JKipTYXZlIGFuYWx5c2lzLXJlYWR5IG9iamVjdHMqKgoKICAtIEEgY2xlYW5lZCwgZ2VudXMtbGV2ZWwgcGh5bG9zZXEgb2JqZWN0IChgcGh5bG9zZXFfZ2VudXMuUkRhdGFgKQogIC0gSXRzIG1lbHRlZCB2ZXJzaW9uIChgcGh5bG9zZXFfbWVsdF9nZW51cy5SRGF0YWApIGZvciBnZ3Bsb3Qgd29ya2Zsb3dzCiAgLSBUaGUgcHJ1bmVkLCBnZW51cy1sZXZlbCB0cmVlIChgdHJlZV9nZW51cy5SRGF0YWApCiAgLSBBbmFsb2dvdXMgb2JqZWN0cyBmb3IgRmFtaWx5LCBPcmRlciwgQ2xhc3MsIGFuZCBQaHlsdW0KCiMjIEJ5IHRoZSBlbmQgb2YgdGhpcyBzdGFnZSwgeW91IHdpbGwgaGF2ZSBvbmUgcGh5bG9zZXEgb2JqZWN0IHBlciB0YXhvbm9taWMgbGV2ZWwsIGVhY2ggY29udGFpbmluZzoKCiAgLSBBIGNvbnNpc3RlbnQgT1RVIChvciBHZW51cy9GYW1pbHnigKYpIGNvdW50IHRhYmxlCiAgLSBNYXRjaGVkIHNhbXBsZSBtZXRhZGF0YSBhbmQgdGF4b25vbWljIHRhYmxlCiAgLSBBIHBydW5lZCBwaHlsb2dlbmV0aWMgdHJlZQogIAojIFBhY2thZ2VzIFVzZWQKCkluIHRoaXMgc2NyaXB0IHdlIG1vc3RseSB1c2UgdGhlIGBwaHlsb3NlcWAgcGFja2FnZSwgZGVzaWduZWQgZm9yIG1pY3JvYmlvbWUgYW5hbHlzaXMuCgojIyBgcGh5bG9zZXFgIFV0aWxpdHkKCi0gSW50ZWdyYXRlcyBPVFUvQVNWIHRhYmxlcywgc2FtcGxlIG1ldGFkYXRhLCB0YXhvbm9teSwgcGh5bG9nZW5ldGljIHRyZWVzLCBhbmQgKG9wdGlvbmFsbHkpIHJlZmVyZW5jZSBzZXF1ZW5jZXMgaW4gb25lIFM0IG9iamVjdC4KLSBQcm92aWRlcyBjb252ZW5pZW50IG1ldGhvZHMgZm9yIG1lcmdpbmcsIHBydW5pbmcsIHJhcmVmYWN0aW9uLCBkaXN0YW5jZSBjYWxjdWxhdGlvbnMsIGFuZCBwbG90dGluZy4KLSBVbmRlciB0aGUgaG9vZCwgcmVsaWVzIG9uIEJpb2NvbmR1Y3RvciBjbGFzc2VzIChEYXRhRnJhbWVzLCBYU3RyaW5nU2V0cywgcGh5bG8pLgoKPk5vdGU6IHRoZXJlIGlzIG11Y2ggb3ZlcmxhcCBiZXR3ZWVuIGBwaHlsb3NlcWAsIGBtaWNyb2Vjb2AsIGFuZCBgbWljcm9iaW9tZWAsIGJ1dCBlYWNoIG1ha2VzIHNvbWUgc3RlcHMgbW9yZSBzdHJlYW1saW5lZCB0aGFuIG90aGVycywgc28gSSBwcmVmZXIgdG8gc3dpdGNoIGJldHdlZW4gdGhlbSBmb3IgZGlmZmVyZW50IHN0YWdlcyBvZiBhbmFseXNpcy4KCldlIHdpbGwgYWxzbyB1c2UgdGhlIGB0cmVlZGF0YXZlcnNlYCBwYWNrYWdlIHN1aXRlIGZvciBzb21lIHZpc3VhbGl6YXRpb24gdG8gY2hlY2sgaW4gb24gb3VyIGRhdGEgcXVhbGl0eS4KCiMjIGB0cmVlZGF0YXZlcnNlYCBVdGlsaXR5CgpUaGUgYHRyZWVkYXRhdmVyc2VgIHN1aXRlIHByb3ZpZGVzIHRvb2xzIGZvciBtYW5hZ2luZywgc2hhcmluZywgYW5kIHZpc3VhbGl6aW5nIHBoeWxvZ2VuZXRpYyB0cmVlcyBpbiBSLiBJdCBidWlsZHMgb24gdGhlIERhdGF2ZXJzZSBwbGF0Zm9ybSB0byBzdG9yZSB0cmVlcyAoYW5kIGFzc29jaWF0ZWQgZGF0YSkgaW4gdmVyc2lvbmVkLCBjaXRhYmxlIHJlcG9zaXRvcmllcy4gV2l0aCBgdHJlZWRhdGF2ZXJzZWAsIHlvdSBjYW46CgogIC0gVXBsb2FkIG9yIGRvd25sb2FkIHBoeWxvIG9iamVjdHMgZGlyZWN0bHkgZnJvbSBhIERhdGF2ZXJzZSBjb2xsZWN0aW9uCiAgLSBBdHRhY2ggcmljaCBtZXRhZGF0YSAoZS5nLiBzdHVkeSBkZXRhaWxzLCB0YXhvbiBwcm92ZW5hbmNlKSB0byBlYWNoIHRyZWUKICAtIFRyYWNrIHVwZGF0ZXMgYW5kIGNvbGxhYm9yYXRlIG9uIHRyZWUgZGF0YSB3aXRoIGZ1bGwgcHJvdmVuYW5jZQogIC0gSW50ZWdyYXRlIHNlYW1sZXNzbHkgd2l0aCBnZ3RyZWUgYW5kIGFwZSBmb3IgZG93bnN0cmVhbSBwbG90dGluZyBhbmQgYW5hbHlzaXMKCiMjIyBgZ2d0cmVlYCBQYWNrYWdlIHdpdGhpbiB0aGUgYHRyZWVkYXRhdmVyc2VgCgpgZ2d0cmVlYCBpcyBhbiBleHRlbnNpb24gb2YgYGdncGxvdDJgIHRhaWxvcmVkIGZvciBwaHlsb2dlbmV0aWMgdHJlZXMuIEl0IGxldHMgeW91OgoKICAtIE1hcCB0cmVlIGRhdGEgKGJyYW5jaGVzLCBub2RlIGxhYmVscywgc3VwcG9ydCB2YWx1ZXMpIHRvIGFlc3RoZXRpYyBzY2FsZXMKICAtIEFubm90YXRlIGNsYWRlcyB3aXRoIGhlYXRtYXBzLCBiYXIgY2hhcnRzLCBvciB0aXAgcG9pbnRzIChlLmcuIHRheG9uIGFidW5kYW5jZXMpCiAgLSBDb2xsYXBzZSBvciBleHBhbmQgc3VidHJlZXMgaW50ZXJhY3RpdmVseQogIC0gQWxpZ24gYXNzb2NpYXRlZCBkYXRhIChlLmcuIHRyYWl0IG1hdHJpY2VzKSBhbG9uZ3NpZGUgeW91ciB0cmVlIGluIG11bHRpLXBhbmVsIGxheW91dHMKICAtIExldmVyYWdlIHRoZSBmdWxsIGdyYW1tYXIgb2YgZ3JhcGhpY3MgZm9yIHB1YmxpY2F0aW9uLXF1YWxpdHkgZmlndXJlcwoKLS0tCgojIEhlbHBlciBGdW5jdGlvbnMKCkkgY3JlYXRlZCB0aGUgZnVuY3Rpb25zIGJlbG93IGJlY2F1c2UgSSByZXBlYXRlZGx5IHVzZSB0aGVzZSBjb2RlIGNodW5rcyB0byB2aWV3IHN1bW1hcmllcyBvZiBteSBkYXRhIGFmdGVyIGVhY2ggc3RlcCBvZiBwcm9jZXNzaW5nLgoKCgoKYGBge3J9CgpteV9za2ltIDwtIHNraW1fd2l0aChudW1lcmljICA9IHNmbChwMjUgPSBOVUxMLCBwNTAgPSBOVUxMLCBwNzUgPSBOVUxMKSkKCnNraW1fcGh5bG9zZXEgPC0gZnVuY3Rpb24ocGh5bG9zZXEpIHsKb3B0aW9ucygKICBkaWdpdHMgICAgICAgICAgICA9IDIsCiAgcGlsbGFyLnNpZ2ZpZyAgICAgPSAyLAogIHBpbGxhci5zdWJ0bGVfbnVtID0gVFJVRQogICkKIHNraW0gPC0gcHNtZWx0KHBoeWxvc2VxKSAlPiUgCiAgICBzZWxlY3QoLWMoCiAgICAgIHN1YmplY3RfY2VydGFpbnR5LCAKICAgICAgc3ViamVjdF9zdHVkYm9va19pZCwgCiAgICAgIHN1YmplY3RfZGFtX2lkLCAKICAgICAgc3ViamVjdF9zaXJlX2lkLCAKICAgICAgc3ViamVjdF9iaXJ0aF9sb2NhdGlvbiwgCiAgICAgIHN1YmplY3RfYWdlKSkgJT4lCiAgICBncm91cF9ieShzdWJqZWN0KSAlPiUgCiAgICBteV9za2ltKCkgJT4lCiAgICBzZWxlY3QoLWNvbXBsZXRlX3JhdGUpCiAKIHJldHVybihza2ltKQp9Cgp2aWV3X3RyZWUgPC0gZnVuY3Rpb24ocGh5bG9zZXEsIGxldmVsID0gTlVMTCwgcGFsZXR0ZSA9ICJyY2FydG9jb2xvcjo6UHJpc20iKSB7CiAgcGh5bHVtLmNvbHMgPC0gIHNhbXBsZShwYWxldHRlZXI6OnBhbGV0dGVlcl9kKHBhc3RlMChwYWxldHRlKSksIHNpemUgPSBsZW5ndGgoZ2V0X3RheGFfdW5pcXVlKHBoeWxvc2VxLCAiUGh5bHVtIikpLCByZXBsYWNlID0gVFJVRSkgJT4lCiAgICBzZXRfbmFtZXMoLiwgZ2V0X3RheGFfdW5pcXVlKHBoeWxvc2VxLCAiUGh5bHVtIikpCiAgCiAgdHJlZTEgPC0gZ2d0cmVlKHBoeWxvc2VxLCBicmFuY2gubGVuZ3RoID0gIm5vbmUiLCBhZXMoY29sb3IgPSBQaHlsdW0pKQogIAogIGlmIChpcy5udWxsKGxldmVsKSkgewogICAgdHJlZTIgPC0gdHJlZTEKICB9IGVsc2UgaWYgKGxldmVsID09ICJDbGFzcyIpIHsKICAgIHRyZWUyIDwtIHRyZWUxICsKICAgICAgZ2VvbV9sYWJlbChhZXMobGFiZWwgPSBDbGFzcywgZmlsbCA9IFBoeWx1bSksIGhqdXN0ID0gLTAuMDUsIHNpemUgPSAyLCBjb2xvdXIgPSAiIzAwMDAwMEZGIikKICB9IGVsc2UgaWYgKGxldmVsID09ICJQaHlsdW0iKSB7CiAgICB0cmVlMiA8LSB0cmVlMSArCiAgICAgIGdlb21fbGFiZWwoYWVzKGxhYmVsID0gUGh5bHVtLCBmaWxsID0gUGh5bHVtKSwgaGp1c3QgPSAtMC4wNSwgc2l6ZSA9IDMsIGNvbG91ciA9ICIjMDAwMDAwRkYiKQogIH0KICAKICB0cmVlLm91dCA8LSB0cmVlMiArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gcGh5bHVtLmNvbHMsIG5hLnZhbHVlID0gIiMwMDAwMDA4MCIpICsKICAgIHNjYWxlX2ZpbGxfbWFudWFsKCB2YWx1ZXMgPSBhbHBoYShjKHBoeWx1bS5jb2xzKSwgMC4zKSkgKwogICAgdGhlbWVfdHJlZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCiAgCiAgcmV0dXJuKHRyZWUub3V0KQp9CmBgYAoKLS0tCgojIExvYWQgRGF0YQoKPk5vdGUgdGhhdCBJIHVzZSBgLlJEYXRhYCBmaWxlcyB0byBsb2FkIHNvbWUgb2YgdGhlIGRhdGEgYmVsb3cuIFlvdSBjb3VsZCBsb2FkIHRoZXNlIHNhbWUgb2JqZWN0cyBpbiB0aGUgZm9ybSBvZiBtb3JlIHdpZGVseSBhcHBsaWNhYmxlIGZpbGVzLCBpZiB5b3Ugd2lzaCAoKnNlZSBiZWxvdyBmb3IgZXhwbGFpbmF0aW9uKikuCgo8ZGV0YWlscz4KPHN1bW1hcnk+PGVtcGg+V2hhdCBpcyBhbiAuUkRhdGEgZmlsZT88L2VtcGg+PC9zdW1tYXJ5Pgo8cD5BbiBgLlJEYXRhYCAob3Igc29tZXRpbWVzIGAucmRhYCkgZmlsZSBpcyBS4oCZcyBuYXRpdmUsIGJpbmFyeSB3b3Jrc3BhY2UgZm9ybWF0LiBXaGVuIHlvdSBjYWxsIGBzYXZlKClgIG9uIG9uZSBvciBtb3JlIFIgb2JqZWN0c+KAlGRhdGEgZnJhbWVzLCBtYXRyaWNlcywgbGlzdHMsIFM0L1MzIG9iamVjdHMsIGV0Yy7igJRSIHNlcmlhbGl6ZXMgdGhlbSBpbnRvIGEgY29tcGFjdCwgcGxhdGZvcm0taW5kZXBlbmRlbnQgZmlsZS4gWW91IGNhbiBsYXRlciByZXN0b3JlIHRob3NlIGV4YWN0IG9iamVjdHMgKHdpdGggdGhlaXIgbmFtZXMgYW5kIGF0dHJpYnV0ZXMgaW50YWN0KSBieSBjYWxsaW5nIGxvYWQoImB5b3VyX2ZpbGUuUkRhdGFgIikuIFVzaW5nIGAuUkRhdGFgIGlzIGFuIGVmZmljaWVudCB3YXkgdG8gY2FjaGUgaW50ZXJtZWRpYXRlIHN0ZXBzLCBzaGFyZSBwcm9jZXNzZWQgZGF0YXNldHMgd2l0aCBjb2xsYWJvcmF0b3JzLCBvciBzcGVlZCB1cCBhbmFseXNlcyBieSBza2lwcGluZyB0aW1lLWNvbnN1bWluZyByZWNvbXB1dGF0aW9uLjwvcD4KPC9kZXRhaWxzPgoKYGBge3J9CnRyZWUgPC0gcmVhZC50cmVlKCJtaWNyb2Vjby9sb3Jpcy9yZWZzX3RyZWUudHJlZWZpbGUiKQpzZXFzIDwtIHJlYWRETkFTdHJpbmdTZXQoIm1pY3JvZWNvL2xvcmlzL3JlZnNfYWxpZ25lZF9tYWZmdC5mYXN0YSIpCmxvYWQoIm1pY3JvZWNvL2xvcmlzL3RheF90YWJsZS5SRGF0YSIpCmxvYWQoIm1pY3JvZWNvL2xvcmlzL3NhbXBsZV90YWJsZS5SRGF0YSIpCmxvYWQoIm1pY3JvZWNvL2xvcmlzL290dV90YWJsZS5SRGF0YSIpCmBgYAoKIyMgU2FtcGxlIE1ldGFkYXRhIGFzIEZhY3RvcnMKClBoeWxvc2VxIHdpbGwgb25seSBjYXB0dXJlIG51bWVyaWMvZmFjdG9yIHZhbHVlcyAobm90IHN0cmluZ3MpIGZvciB0aGUgbWV0YWRhdGEsIHNvIHdlIG5lZWQgdG8gcmVmb3JtYXQgb3VyIGNoYXJhY3RlciBjb2x1bW5zLgoKYGBge3J9CnNhbXBsZV9kYXRhIDwtIHNhbXBsZS50YWJsZSAlPiUKICBhcnJhbmdlKHN1YmplY3QsIGNvbGxlY3Rpb25fZGF5KSAlPiUKICBtdXRhdGUoc3ViamVjdF9jZXJ0YWludHkgICAgICAgPSBmY3RfcmVjb2RlKHN1YmplY3RfY2VydGFpbnR5ICAsICIwIiA9ICJubyIgLCAiMSIgPSAieWVzIiksCiAgICAgICAgIGVudmlyb25tZW50X2hvbGRpbmcgICAgID0gZmN0X3JlY29kZShlbnZpcm9ubWVudF9ob2xkaW5nLCAiMCIgPSAib2xkIiwgIjEiID0gIm5ldyIpLAogICAgICAgICBlbnZpcm9ubWVudF9wYWlyX2FjY2VzcyA9IGZjdF9yZWNvZGUoZW52aXJvbm1lbnRfcGFpcl9hY2Nlc3MsICIwIiA9ICJuIiwgIjEiID0gInkiKSwKICAgICAgICAgcmVwcm9fd2FyYl9zdGF0dXMgICAgICAgPSBmY3RfcmVjb2RlKHJlcHJvX3dhcmJfc3RhdHVzLCAiMCIgPSAiYW5lc3RydXMiLCAiMSIgPSAiZXN0cnVzIikpICU+JQogIG11dGF0ZShhY3Jvc3Mod2hlcmUoaXMuY2hhcmFjdGVyKSwgfmZhY3RvciguKSkpICU+JQogIG11dGF0ZShkaWV0X25hbWUgPSBmY3RfaW5vcmRlcihkaWV0X25hbWUpKQpgYGAKICAKIyMgUGh5bG9zZXEgT2JqZWN0CgpgYGB7cn0KcGh5bG8gPC0gcGh5bG9zZXEoCiAgdGF4X3RhYmxlKGFzLm1hdHJpeCh0YXgudGFibGUpKSwKICBvdHVfdGFibGUoYXMubWF0cml4KG90dS50YWJsZSksIHRheGFfYXJlX3Jvd3MgPSBUUlVFKSwKICBzYW1wbGVfZGF0YShzYW1wbGVfZGF0YSksCiAgcGh5X3RyZWUodHJlZSksCiAgcmVmc2VxKHNlcXMpCikKYGBgCgojIyBQcmV2aWV3IFN0YXJ0aW5nIERhdGEKCmBgYHtyfQpza2ltX3BoeWxvc2VxKHBoeWxvKQpgYGAKCgpgYGB7cn0Kdmlld190cmVlKHBoeWxvKSArIGdndGl0bGUoIlNwZWNpZXMtTGV2ZWwgT1RVcyBiZWZvcmUgRmlsdGVyaW5nIikKYGBgCgpUaGF0IGxvb2tzIGxpa2Ugc29tZSB2ZXJ5IGRlbnNlLCBtZXNzeSB0YXhvbm9taWMgZGF0YSEKCi0tLQoKIyBEZXJlcGxpY2F0ZSBTYW1wbGVzCgpGaXJzdCB3ZSB3aWxsIGNyZWF0ZSBhIHZlcnNpb24gdGhhdCBtZXJnZXMgdGhlIHJlcGxpY2F0ZWQgc2FtcGxlcyBzbyB0aGF0IHdlIGhhdmUgb25lIG9ic2VydmF0aW9uIHBlciBzdWJqZWN0IHBlciBkYXkuIFRoaXMgZnVuY3Rpb24ncyBkZWZhdWx0IGluIHBoeWxvc2VxIHdpbGwgYWdncmVnYXRlIHRoZSBPVFUgY291bnRzIGFjcm9zcyBtdWx0aXBsZSBzYW1wbGVzIGFzIGEgc3VtIG9mIHJlYWRzIHdoaWxlIHRha2luZyBtZWFuIHZhbHVlcyBmb3IgZXZlcnl0aGluZyBpbiB0aGUgbWV0YWRhdGEuCgo+VGhpcyBwb29saW5nIHN0ZXAgY3JlYXRlcyAqKm9uZSBjb21wb3NpdGUgc2FtcGxlIHBlciBzdWJqZWN0IHBlciBkYXkqKiwgYXZvaWRpbmcgcHNldWRv4oCQcmVwbGljYXRpb24gaW4gZG93bnN0cmVhbSBkaXZlcnNpdHkgbWV0cmljcy4KCmBgYHtyfQpwaHlsb19tZXJnZWQgPC0gcGh5bG8gJT4lIG1lcmdlX3NhbXBsZXMoInN1YmplY3RfZGF5IikKCnNraW1fcGh5bG9zZXEocGh5bG9fbWVyZ2VkKQpgYGAKCgojIENsZWFuIHVwIFRheG9ub215CgojIyBQcnVuZSBUYXhhCgpEcm9wIHRoZSBPVFVzIHdpdGggdGhlIGxvd2VzdCBhYnVuZGFuY2VzLiBDb25zdHJhaW5pbmcgeW91ciBkYXRhc2V0IHRvIHRheGEgd2l0aCA+MSB0b3RhbCByZWFkIGhlbHBzIHN0YWJpbGl6ZSBkaXZlcnNpdHkgZXN0aW1hdGVzIGFuZCBzcGVlZHMgdXAgdHJlZSBvcGVyYXRpb25zLiAgCiAgCioqRmlyc3QgbGV0J3Mgc2VlIGhvdyBtYW55IE9UVXMgd2UgbG9zZSBhdCBkaWZmZXJlbnQgdGhyZXNob2xkcyoqCgpgYGB7cn0KcmFyZV9vdHVzIDwtIG5hbWVzKHRheGFfc3VtcyhwaHlsb19tZXJnZWQpW3RheGFfc3VtcyhwaHlsb19tZXJnZWQpIDw9IDFdKQprZWVwX290dXMgPC0gbmFtZXModGF4YV9zdW1zKHBoeWxvX21lcmdlZClbdGF4YV9zdW1zKHBoeWxvX21lcmdlZCkgPiAxXSkKCmxlbmd0aChyYXJlX290dXMpCmxlbmd0aChrZWVwX290dXMpCmBgYAoKV2Ugd2lsbCByZW1vdmUgNTk5IG90dXMgd2hlcmUgdGhlIHRvdGFsIGFidW5kYW5jZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMSBhbmQga2VlcCB0aGUgMTY0NSBvdHVzIHdpdGggYSB0b3RhbCBhYnVuZGFuY2Ugb2YgYXQgbGVhc3QgMi4gKCpZb3UgY2FuIGNoYW5nZSB0aGUgdmFsdWUgaW4gdGhlIGBrZWVwX290dXNgIGZ1bmN0aW9uIGFib3ZlIHRvIHVzZSBhIGhpZ2hlci9sb3dlciB0aHJlc2hvbGQuKikKCmBgYHtyfQpwaHlsb19wcnVuZWQgPC0gcHJ1bmVfdGF4YShrZWVwX290dXMsIHBoeWxvX21lcmdlZCkKc2tpbV9waHlsb3NlcShwaHlsb19wcnVuZWQpCmBgYAoKYGBge3J9CnZpZXdfdHJlZShwaHlsb19wcnVuZWQpICsgZ2d0aXRsZSgiU3BlY2llcy1MZXZlbCBPVFVzIGFmdGVyIEZpbHRlcmluZyIpCmBgYAoKCiMjIENvbGxhcHNlIFRheGEgdG8gR2VudXMgTGV2ZWwKCkNvbGxhcHNpbmcgYXQgZ2VudXMgbGV2ZWwgcmVkdWNlcyBjb21wbGV4aXR5IGFuZCBhbGxvd3MgZ2VudXPigJBzY2FsZSBlY29sb2dpY2FsIHBhdHRlcm5zIHRvIGVtZXJnZSB3aXRoIGxlc3MgaW50ZXJmZXJlbmNlIGZyb20gcmFuZG9tIGVycm9yIGF0IHRoZSBzcGVjaWVzLWFzc2lnbm1lbnQgbGV2ZWwuCgpgYGB7cn0KcGh5bG9fZ2VudXMgPC0gcGh5bG9fcHJ1bmVkICU+JSB0YXhfZ2xvbSgiR2VudXMiKQpza2ltX3BoeWxvc2VxKHBoeWxvX2dlbnVzKQpgYGAKCgpgYGB7cn0Kdmlld190cmVlKHBoeWxvX2dlbnVzKSArIGdndGl0bGUoIkdlbnVzLUxldmVsIE9UVXMiKQpgYGAKCiMjIEFub3RoZXIgUHJ1bmluZyBDaGVjawoKTGV0J3MgbG9vayBhdCBvdXIgT1RVcyBub3cgdGhhdCB3ZSBtZXJnZWQgdG8gdGhlIEdlbnVzIGxldmVsCgoKYGBge3J9CnJhcmVfZ2VuZXJhIDwtIG5hbWVzKHRheGFfc3VtcyhwaHlsb19nZW51cylbdGF4YV9zdW1zKHBoeWxvX2dlbnVzKSA8PSAyXSkKa2VlcF9nZW5lcmEgPC0gbmFtZXModGF4YV9zdW1zKHBoeWxvX2dlbnVzKVt0YXhhX3N1bXMocGh5bG9fZ2VudXMpID4gMl0pCmxlbmd0aChyYXJlX2dlbmVyYSkKbGVuZ3RoKGtlZXBfZ2VuZXJhKQpgYGAKCkxldCdzIGRvIG9uZSBtb3JlIHBydW5pbmcgc3RlcCB0byBvbmx5IGtlZXAgdGhlIGdlbmVyYSB3aXRoIHRvdGFsIGFidW5kYW5jZXMgZ3JlYXRlciB0aGFuIDIgKDYxMyBnZW5lcmEgdG90YWwpLgoKYGBge3J9CnBoeWxvX2NsZWFuIDwtIHBydW5lX3RheGEoa2VlcF9nZW5lcmEsIHBoeWxvX2dlbnVzKQpza2ltX3BoeWxvc2VxKHBoeWxvX2NsZWFuKQpgYGAKCmBgYHtyIHJlc3VsdHM9J2FzaXMnfQp2aWV3X3RyZWUocGh5bG9fY2xlYW4pICsgZ2d0aXRsZSgiR2VudXMtTGV2ZWwgT1RVcyIpCmBgYAoKCiMjIEV4dHJhY3QgYW5kIFNhdmUgQ2xlYW4gUGh5bG9zZXEgT2JqZWN0cwoKRXhwb3J0aW5nIGludGVybWVkaWF0ZSBvYmplY3RzIHNhdmVzIHRpbWUgaWYgeW91IG5lZWQgdG8gcmXigJBydW4gbGF0ZXIgc3RlcHMgd2l0aG91dCByZeKAkHByb2Nlc3NpbmcuCgpgYGB7cn0KcGh5bG9fbWVsdF9jbGVhbiAgICAgPC0gcHNtZWx0KHBoeWxvX2NsZWFuKQpjbGVhbl90cmVlICAgICAgICAgICA8LSBwaHlfdHJlZShwaHlsb19jbGVhbikKc2F2ZShwaHlsb19jbGVhbiAgICAgLCBmaWxlID0gIm1pY3JvZWNvL2xvcmlzL3BoeWxvc2VxX2dlbnVzLlJEYXRhIikKc2F2ZShjbGVhbl90cmVlICAgICAgLCBmaWxlID0gIm1pY3JvZWNvL2xvcmlzL3RyZWVfZ2VudXMuUkRhdGEiKQpzYXZlKHBoeWxvX21lbHRfY2xlYW4sIGZpbGUgPSAibWljcm9lY28vbG9yaXMvcGh5bG9zZXFfbWVsdF9nZW51cy5SRGF0YSIpCmBgYAoKIyBTdWJzZXQgQWRkaXRpb25hbCBUYXhvbm9taWMgTGV2ZWxzCgpXb3JraW5nIGF0IG11bHRpcGxlIHJhbmtzIGxldHMgeW91IGNvbXBhcmUgY29tbXVuaXR5IHN0cnVjdHVyZSBmcm9tIGJyb2FkIChQaHlsdW0pIHRvIGZpbmUgKEdlbnVzKSBzY2FsZXMgaW4gdGhlIHNhbWUgcGlwZWxpbmUuCgpgYGB7cn0KZmFtX3BoeWxvIDwtIHBoeWxvX2NsZWFuICU+JSB0YXhfZ2xvbSgiRmFtaWx5IikKb3JkX3BoeWxvIDwtIHBoeWxvX2NsZWFuICU+JSB0YXhfZ2xvbSgiT3JkZXIiKQpjbGFfcGh5bG8gPC0gcGh5bG9fY2xlYW4gJT4lIHRheF9nbG9tKCJDbGFzcyIpCnBoeV9waHlsbyA8LSBwaHlsb19jbGVhbiAlPiUgdGF4X2dsb20oIlBoeWx1bSIpCgp2aWV3X3RyZWUoZmFtX3BoeWxvKSArIGdndGl0bGUoIkZhbWlseS1MZXZlbCBPVFVzIikgCnZpZXdfdHJlZShvcmRfcGh5bG8pICsgZ2d0aXRsZSgiT3JkZXItTGV2ZWwgT1RVcyIpCnZpZXdfdHJlZShjbGFfcGh5bG8sICJDbGFzcyIpICsgZ2d0aXRsZSgiQ2xhc3MtTGV2ZWwgT1RVcyIpICsgCiAgICAgIGNvb3JkX2NhcnRlc2lhbihjbGlwID0gIm9mZiIpICsgCiAgICAgIHRoZW1lKHBsb3QubWFyZ2luID0gbWFyZ2luKDUsIDY1LCA1LCA1LCAicHQiKSkKdmlld190cmVlKHBoeV9waHlsbywgIlBoeWx1bSIpICsgZ2d0aXRsZSgiUGh5bHVtLUxldmVsIE9UVXMiKSArICAKICAgICAgY29vcmRfY2FydGVzaWFuKGNsaXAgPSAib2ZmIikgKyAKICAgICAgdGhlbWUocGxvdC5tYXJnaW4gPSBtYXJnaW4oNSwgNjUsIDUsIDUsICJwdCIpKQpgYGAKCiMjIEV4dHJhY3QgYW5kIFNhdmUgZm9yIE90aGVyIExldmVscwoKYGBge3J9CmZhbV9waHlsb19tZWx0ICAgICA8LSBwc21lbHQoZmFtX3BoeWxvKQpvcmRfcGh5bG9fbWVsdCAgICAgPC0gcHNtZWx0KG9yZF9waHlsbykKY2xhX3BoeWxvX21lbHQgICAgIDwtIHBzbWVsdChjbGFfcGh5bG8pCnBoeV9waHlsb19tZWx0ICAgICA8LSBwc21lbHQocGh5X3BoeWxvKQoKZmFtX3RyZWUgICAgICAgICAgIDwtIHBoeV90cmVlKGZhbV9waHlsbykKb3JkX3RyZWUgICAgICAgICAgIDwtIHBoeV90cmVlKG9yZF9waHlsbykKY2xhX3RyZWUgICAgICAgICAgIDwtIHBoeV90cmVlKGNsYV9waHlsbykKcGh5X3RyZWUgICAgICAgICAgIDwtIHBoeV90cmVlKHBoeV9waHlsbykKCnNhdmUoZmFtX3BoeWxvICAgICAsIGZpbGUgPSAibWljcm9lY28vbG9yaXMvcGh5bG9zZXFfZmFtaWx5LlJEYXRhIikKc2F2ZShvcmRfcGh5bG8gICAgICwgZmlsZSA9ICJtaWNyb2Vjby9sb3Jpcy9waHlsb3NlcV9vcmRlci5SRGF0YSIpCnNhdmUoY2xhX3BoeWxvICAgICAsIGZpbGUgPSAibWljcm9lY28vbG9yaXMvcGh5bG9zZXFfY2xhc3MuUkRhdGEiKQpzYXZlKHBoeV9waHlsbyAgICAgLCBmaWxlID0gIm1pY3JvZWNvL2xvcmlzL3BoeWxvc2VxX3BoeWx1bS5SRGF0YSIpCgpzYXZlKGZhbV90cmVlICAgICAgLCBmaWxlID0gIm1pY3JvZWNvL2xvcmlzL3RyZWVfZmFtaWx5LlJEYXRhIikKc2F2ZShvcmRfdHJlZSAgICAgICwgZmlsZSA9ICJtaWNyb2Vjby9sb3Jpcy90cmVlX29yZGVyLlJEYXRhIikKc2F2ZShjbGFfdHJlZSAgICAgICwgZmlsZSA9ICJtaWNyb2Vjby9sb3Jpcy90cmVlX2NsYXNzLlJEYXRhIikKc2F2ZShwaHlfdHJlZSAgICAgICwgZmlsZSA9ICJtaWNyb2Vjby9sb3Jpcy90cmVlX3BoeWx1bS5SRGF0YSIpCgpzYXZlKGZhbV9waHlsb19tZWx0LCBmaWxlID0gIm1pY3JvZWNvL2xvcmlzL3BoeWxvc2VxX21lbHRfZmFtaWx5LlJEYXRhIikKc2F2ZShvcmRfcGh5bG9fbWVsdCwgZmlsZSA9ICJtaWNyb2Vjby9sb3Jpcy9waHlsb3NlcV9tZWx0X29yZGVyLlJEYXRhIikKc2F2ZShjbGFfcGh5bG9fbWVsdCwgZmlsZSA9ICJtaWNyb2Vjby9sb3Jpcy9waHlsb3NlcV9tZWx0X2NsYXNzLlJEYXRhIikKc2F2ZShwaHlfcGh5bG9fbWVsdCwgZmlsZSA9ICJtaWNyb2Vjby9sb3Jpcy9waHlsb3NlcV9tZWx0X3BoeWx1bS5SRGF0YSIpCmBgYAoKLS0tCgojIE5leHQgU3RlcHMKCkluIHRoZSBbYG1pY3JvYmlvbWVfbWV0cmljc2AgdHV0b3JpYWxdKGh0dHBzOi8vcmljaC1tb2xlY3VsYXItaGVhbHRoLWxhYi5naXRodWIuaW8vdHV0b3JpYWxzL21pY3JvYmlvbWVfbWV0cmljcy5odG1sKSB5b3Ugd2lsbCBsZWFybiBob3cgdG8gY2hvb3NlIGFuZCBhcHBseSByYXJlZmFjdGlvbiBvciByZWxhdGl2ZS1hYnVuZGFuY2Ugbm9ybWFsaXphdGlvbiwgYW5kIHRoZW4gY2FsY3VsYXRlIGZ1bmRhbWVudGFsIGRpdmVyc2l0eSBzdGF0aXN0aWNzICjOsS1kaXZlcnNpdHkgaW5kaWNlcywgzrItZGl2ZXJzaXR5IGRpc3RhbmNlcywgVW5pRnJhYywgZXRjLikuICBSZWZlciB0byB0aGF0IHNlY3Rpb24gdG8gZGVjaWRlIHdoZW4gYW5kIGhvdyB0byByYXJlZnkgeW91ciBtZXJnZWQgdGFibGVzLCBvciB0byB3b3JrIGRpcmVjdGx5IG9uIG5vcm1hbGl6ZWQgY291bnRzIGZvciBub24tcGh5bG9nZW5ldGljIG1ldHJpY3MuCgoKCg==